Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:计算后缀表达式_Java_Stack_Postfix Notation - Fatal编程技术网

Java:计算后缀表达式

Java:计算后缀表达式,java,stack,postfix-notation,Java,Stack,Postfix Notation,这是一个理论问题: 我必须计算一个已经从中缀转换为后缀的表达式。后缀保存在队列中,因为我想避免使用字符串。这样我就知道了数字之间的划分在哪里,我可以按“正确”的顺序访问它 看起来是这样的: // 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, -] 现在我想使用两个堆栈: 原始堆栈(事先已填充队列内容) 和目标堆栈 将后缀表达式

这是一个理论问题:

我必须计算一个已经从中缀转换为后缀的表达式。后缀保存在
队列中
,因为我想避免使用
字符串
。这样我就知道了数字之间的划分在哪里,我可以按“正确”的顺序访问它

看起来是这样的:

// 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
    的所有模式并一次性处理它们
  • 如果第二种选择是可行的,那怎么做呢

不需要。您只需要一个堆栈,完成后就没有什么可以“从头开始”的了


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

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