用于评估后缀表达式的推送和弹出操作的数量

时间:2015-02-22 05:06:16

标签: c#

我需要评估后缀表达式(A*B)+(C*D/E) 通过反向抛光表示法 我的问题是需要多少推送和弹出操作来通过反向抛光表示法来评估这个表达式 提前谢谢你

1 个答案:

答案 0 :(得分:0)

首先,这不是一个修复后的表达式,它是一个正常的表达式。

http://en.wikipedia.org/wiki/Reverse_Polish_notation

如果它是在修复后的表示法中。它看起来像这样:

AB*CD*E/+

用于获得此表达式的算法是:http://en.wikipedia.org/wiki/Shunting-yard_algorithm

我会逐步说明(A*B)+(C*D/E)

假设有一个输出队列,它保存表达式,因为它转换为RPN以及操作符堆栈。

  1. 按下(到操作员堆栈。
  2. 将A放在输出队列中,因为它是一个值。
  3. 按*打开操作员堆栈。
  4. 将B放入输出队列。
  5. 检查);将*从运算符堆栈弹出到输出队列,将左括号从堆栈中弹出但不会弹出到输出队列中。
  6. 按+开启操作员堆栈。
  7. 按下(到操作员堆栈。
  8. 将C放入输出队列。
  9. 将*推送到操作员堆栈。
  10. 将D放在输出队列中。
  11. 检查/。它与*具有相同的优先级,因此将其从运算符堆栈弹出到输出队列并推送到运算符堆栈。
  12. 将E放在输出队列中。
  13. 检查)。将操作符堆栈弹出/关闭到输出队列中,弹出(变为不存在。
  14. 没有什么可以阅读,所以将所有剩余的操作员从堆栈中弹出。在这种情况下,它只是+。
  15. 输出输出队列中的所有字符。
  16. Voila:AB*CD*E/+如果计算括号,则总共有6次推送和6次来自操作员堆栈;如果仅计算运算符,则4次推送和弹出。

    希望这会有所帮助。