【问题标题】:Java: Evaluate postfix expressionJava:评估后缀表达式
【发布时间】:2014-04-08 17:00:16
【问题描述】:

这是理论上的:

我必须评估一个已经从 infix 转换为 postfix 的表达式。后缀保存在Queue 中,因为我想避免使用String。这样我就知道数字之间的区别在哪里,我可以按“正确”的顺序访问它。

看起来像这样:

// Original expression: 2+(3+1)-(5-3)^2*3-1
Queue: [2.0, 3.0, 1.0, +, +, 5.0, 3.0, -, 2.0, ^, 3.0, *, -,1.0, -]

现在我想使用两个堆栈:

  • 原始栈(已经被队列内容预先填满)
  • 和目标堆栈

将后缀表达式从一个传递到另一个,同时询问当前元素是否是一个数字或运算符并计算连续数字。

如果我到达一个操作员并且数量至少为 2,我将执行该操作并将其推送到目标堆栈上。到达原始堆栈的末尾(现在为空),我会将所有内容传回给它并重新开始,直到只剩下结果。

我现在问我:

  • 这是一种好方法还是我应该尝试检测NumberNumberOperator 类型的所有模式并一次性处理它们?
  • 如果第二个选项是要走的路,怎么办?

【问题讨论】:

  • 听起来很复杂。为什么不只是一堆数字。如果您从队列中读取一个数字,请将其压入堆栈。如果您读取一个运算符,将其操作数从堆栈中弹出,执行操作,然后将结果推回。如果操作数不存在,则抛出异常。
  • 好吧,通过阅读我理解的维基百科。删除了我的评论。

标签: java stack postfix-notation


【解决方案1】:

没有。你只需要一个堆栈,当你完成后,就没有什么可以“重新开始”了。

当你出列一个数字时,推送它:当你出列一个操作符时,弹出两个值,用这两个操作数计算操作符,然后推送结果。当您到达输入的末尾时,堆栈中应该只有一个值,即结果。否则输入格式不正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 2014-07-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多