我遇到了一个任务,它会让你检查作为参数传递给你的方法/函数的String是否是反向波兰表示法中的正确语句。它可以包含小写字母,操作符号和整数。有没有更快的方法来检查它而不是分别读取每个字符并实际尝试评估整个表达式?
答案 0 :(得分:11)
您不必评估整个表达式,但您需要将其拆分为标记,并且您必须知道每个运算符的效价(即,它需要多少个操作数)。为简单起见,让操作数的效价为0;然后执行以下操作:
Set stack_size to 0;
For Each token In expression:
Set stack_size to stack_size + 1 - valence(token)
If stack_size <= 0: Report failure
If stack_size == 1: Report success
Else : Report failure
使用_
进行一元减号的示例。
expression: 3 4 + 1 * _
stack_size: 0 1 2 1 2 1 1 -> success
expression: 2 3 4 + 1 * _
stack_size: 0 1 2 3 2 3 2 2 -> failure (not 1 at the end)
expression: 2 3 + + 1 * _
stack_size: 0 1 2 1 0 -> failure (stack_size <= 0)
答案 1 :(得分:0)
您可以使用解析表识别反向抛光表示法。它需要查看每个角色,但速度很快。
答案 2 :(得分:0)
Wikipedia有一个很好的算法来解析表达式。除非表达式无效(在这种情况下你可以提前终止),否则你无法比O(n)做得更好。也就是说,您必须评估字符串中的所有标记以确保它有效。