【发布时间】:2009-04-25 22:28:32
【问题描述】:
评估包含后缀表达式(例如:3 5 +)的字符串(数组,某物)以检查有效性的好方法是什么?
【问题讨论】:
-
请更准确地说“有效”或“无效”是什么意思,也许有例子。
标签: validation postfix-notation
评估包含后缀表达式(例如:3 5 +)的字符串(数组,某物)以检查有效性的好方法是什么?
【问题讨论】:
标签: validation postfix-notation
我在这里假设您所说的 valid 是指执行代码永远不会下溢堆栈,并且会在堆栈上留下一个值。如果您有更严格的有效性概念,则需要更复杂的检查器。
如果你想检查这种有效性,没有必要评估字符串,你可以使用计数器,而不是堆栈。如果您进行评估,计数器会跟踪将在堆栈上的值的数量。为简化起见,假设您只有文字、二元运算符和一元运算符。该算法使用特殊的递减操作:如果递减时,计数器低于零,则字符串无效:
【讨论】:
[2, +, 2] 将是有效的。
后缀表达式有效当且仅当:
1) 前两个元素是操作数(值),
2) 最后一个元素是一个运算符,并且
3) 对于每 n 个值,有 n-1 个运算符,并且
4) 在 n 个元素的列表中,从索引 i = 0 开始,对于 i 1 )组成的元素后跟 ( k-1) 运营商。当k=1时,后面的算子数=k=1。
【讨论】:
算法:维护一个堆栈并扫描 后缀表达式从左到右 – 如果元素是数字,则将其推入 堆 – 如果元素是运算符O,则弹出两次 并分别得到A和B。计算 BOA 并将其推回堆栈 – 当表达式结束时,数字 在堆栈中是最终的答案
//为了有效性如果你在堆栈中只剩下一个数字,它的正确表达式
//如果你在堆栈中留下了多个数字并且没有运算符,那么它是错误的
//如果堆栈中只有一个或没有数字并且操作符离开,那么它是错误的
【讨论】:
检查后缀表达式是否有效:(如果输入在 char 数组中) 1.操作数的数量必须等于no。运营商 + 1。 要检查这一点,请保留一个检查变量。 检查= 0。对每个操作数递增 this,对每个运算符递减。如果最终它的值为 1,则表达式有效。
2.数组的前2个元素必须是操作数。没有后缀表达式可以将运算符作为第一个或第二个元素。 通过 if 控制语句检查。
【讨论】: