11

评估包含后缀表达式(例如:3 5 +)的字符串(数组,某物)以检查有效性的好方法是什么?

4

4 回答 4

18

我在这里假设您所说的有效是指执行代码永远不会下溢堆栈,并且会在堆栈上留下一个值。如果您有更严格的有效性概念,您将需要更复杂的检查器。

如果你想检查这种有效性,没有必要评估字符串,你可以使用计数器,而不是堆栈。如果您进行评估,计数器会跟踪将在堆栈上的值的数量。为简化起见,假设您只有文字、二元运算符和一元运算符。该算法使用特殊的递减操作:如果递减时,计数器低于零,则字符串无效:

  1. 将计数器初始化为 0。
  2. 当您看到文字时,增加计数器。
  3. 当您看到二元运算符时,将计数器递减两次,然后将其递增。
  4. 当你看到一个一元运算符时,递减计数器,然后递增它。
  5. 在字符串的末尾,如果计数器为 1,并且如果它从未低于 0,则该字符串是有效的。
于 2009-04-25T22:40:13.513 回答
4

后缀表达式有效当且仅当:

1) 前两个元素是操作数(值),并且

2) 最后一个元素是运算符,并且

3) 对于每 n 个值,有 n-1 个运算符,并且

4) 在 n 个元素的列表中,从索引 i = 0 开始,对于 i < n-1(倒数第二个元素),每组由 k 个值(对于 k > 1 )组成的元素后跟 (k-1 ) 运算符。当 k = 1 时,后面的运算符数 = k = 1。

于 2017-02-23T21:53:29.527 回答
1

算法:维护一个栈,从左到右扫描后缀表达式——如果元素是数字,则将其压入栈中——如果元素是运算符O,则弹出两次,分别得到A和B。计算BOA并推回堆栈——当表达式结束时,堆栈中的数字就是最终的答案

//为了有效性如果你在堆栈中只剩下一个数字,它的正确表达式

//如果你在堆栈中留下了多个数字并且没有运算符,那么它是错误的

//如果堆栈中有一个或没有数字并且操作符离开,那么它是错误的

于 2013-08-16T14:32:09.327 回答
0

检查后缀表达式是否有效:(如果输入在 char 数组中) 1. 操作数的数量必须等于 no。运营商 + 1。要检查这一点,请保留一个检查变量。检查= 0。对每个操作数递增,对每个运算符递减。如果最终其值为 1,则表达式有效。

2.数组的前2个元素必须是操作数。没有后缀表达式可以将运算符作为第一个或第二个元素。通过 if 控制语句检查这一点。

于 2014-10-31T09:22:23.180 回答