2013-01-24 56 views

回答

8

您不必评估整个表达式,但需要将其分解为令牌,并且必须知道每个运算符的价数(即需要多少操作数)。为简单起见,让一个操作数的价数为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) 
+0

非常好。非常感谢! :) – Straightfw

0

您可以使用分析表来识别反向擦亮符号。它需要看每个角色,但速度很快。

+0

我明白了。谢谢:) – Straightfw

0

Wikipedia有一个很好的算法来解析表达式。除非表达无效(在这种情况下你可能会提前终止),否则你不可能比O(n)做得更好。也就是说,您必须评估字符串中的所有标记以确保其有效。

相关问题