如何使用堆栈在一次扫描中评估中缀表达式?

nik*_*o28 45 stack infix-notation

我想知道是否有一种方法可以使用2个堆栈在单个传递中解决中缀表达式?堆栈可以是一个用于操作员,另一个用于操作数...

通过分流码算法求解的标准方法是将中缀表达式转换为后缀(反向抛光)然后求解.我不想先将表达式转换为postfix.

如果表达式2*3-(6+5)+8如何,如何解决?

Roh*_*hit 68

很晚,但这是答案.

拿两堆:

  1. operator stack {为运营商和括号}.
  2. operand stack.

算法

如果存在要读取的字符:

  1. 如果字符operand按下operand stack,如果是字符(,则按下operator stack.
  2. 否则,如果角色是 operator
    1. 虽然顶部的operator stack优先级不是比这个字符小.
    2. operator从中弹出operator stack.
    3. 弹出两个operands(op1op2)来自operand stack.
    4. 存储op1 op op2operand stack2.1 的背面.
  3. 否则如果角色是),请执行与2.2 - 2.4相同的操作直到遇到(.

否则(没有更多的字符可供阅读):

  • 流行操作员直到operator stack不空.
  • 弹出顶部2 operandspush op1 op op2operand stack.

从中返回最高值operand stack.

  • @EJP从未听说过任何调车码算法.我自己想出了这个算法,这可能是dijkstra甚至在我之前想出来的.我本来会这样做的..不是在我确认后才先问我并给它一个-1,我挑衅你要证明我不能自己想出这个算法并且这个文本被改编或复制了来自某个地方.我很乐意在这种情况下进行必要的修改.谢谢 (26认同)
  • 哇,给出-1这是令人讨厌的. (23认同)
  • @EJP Djikstra是一位伟大的科学家,但我确实认为学生可以提出这个算法,特别是考虑到使用两个堆栈的线索. (4认同)
  • "[直到你遇到的情况一样2)" - 应该有'('而不是')'我相信!(我的算法中的这个拼写错误引起了一些麻烦!) (2认同)
  • 这是Dijkstra Shunting-yard Algorithm,Edsger Dijkstra,1960.-1的未归属叙述,用于省略归因. (2认同)
  • 对于任何感兴趣的民间,步骤1应为"1.如果字符是操作数或(推到堆栈:.如果在operandStack并且如果操作数推(在operatorStack" (2认同)