2014-04-08 79 views
0

这是一个理论上的一个:的Java:评估后缀表达式

我要评价我已经转化而来后缀的表达式。后缀保存在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, -] 

现在我想用两个栈:

  • 起源栈
  • 和目的地(已事先与队列内容填充)堆栈

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

如果我到达一个操作员,并且数目至少为2,我将执行操作并将其推送到目标堆栈。到达原点堆栈的末端(现在为空),我会把所有的东西都传回去,然后重新开始,直到只剩下结果。

我问我现在:

  • 这是一个很好的方法或者我应该宁可尝试检测类型NumberNumberOperator的图案及一次性处理它们?
  • 如果第二个选择是要走的路,那怎么可能呢?
+3

听起来很复杂。为什么不只是一堆数字。如果您从队列中读取数字,请将其推入堆栈。如果你阅读一个操作符,将其操作数从堆栈中弹出,执行操作,并将结果重新打开。如果操作数不在那里,则抛出异常。 –

+0

好吧,通过阅读维基百科我明白。删除了我的评论。 –

回答

1

不,你只需要一个堆栈,当你完成时,没有什么可以'开始'了。

当您将一个数字出列时,按下它:当您将一个操作符出队时,弹出两个值,用这两个操作数评估操作符并推送结果。当你到达输入末尾时,堆栈中应该只有一个值,即结果。否则,输入是不合格的。