确定数学运算符的优先级

时间:2013-10-21 21:04:57

标签: java operator-precedence stack

我必须将一个非完全括号的序列从中缀转换为后缀。这也需要使用堆栈。有一个堆栈供操作员存储。我需要确定运算符的优先级,以确保在转换的后缀序列中的正确位置打印正确的运算符。这是伪代码:

DO if(下一个输入是左括号) 阅读左括号并将其推入堆栈。 否则if(下一个输入是数字或其他操作数) 读取操作数并将其写入输出。 否则if(下一个输入是操作符号之一) { 在堆栈中弹出和打印操作,直到发生以下三种情况之一:(1) 堆栈变空,(2)堆栈中的下一个符号是左括号, 或(3)堆栈中的下一个符号是优先级低于的操作 下一个输入符号。当其中一种情况发生时,停止弹出,读取 下一个输入符号,并将此符号推入堆栈。 } 其他 { 读取并丢弃下一个输入符号(应该是右括号)。 从堆栈弹出和打印操作,直到堆栈中的下一个符号为a 左括号。 (如果未遇到左括号,则打印错误消息 表示不平衡的括号并停止。)最后,弹出并丢弃 左括号。 } 虽然(有更多的表达方式要阅读);

粗体文字对我来说是一个令人困惑的部分。有没有人对此采取何种方法?如果需要更多信息,请告诉我....

1 个答案:

答案 0 :(得分:1)

似乎所描述的程序对我来说有点模糊,但我认为它说的是你有

...(2 + 3 ^ 4 * 5 - 6)...

您的筹码开始时看起来像(

所以你找到2并用它做你的事情并找到+。堆栈上的下一个符号是(,因此您可以阅读+并将其推入堆栈。现在你的堆栈看起来像(+

然后你找到3,用它做你的事情然后继续寻找^。这个描述听起来像是你可以开始在这里弹出,因为它符合第二个else if,但你没有,因为你已经鼓起了什么。堆栈上的下一个符号是+,优先级较低。你不知道^之后的符号是什么,所以你无法开始弹出。相反,您将^推送到堆栈并继续解析。您的堆栈看起来像(+^

你找到4并用它做你的事。然后你向前解析,你找到*。堆栈中的下一个符号是更高优先级,因此您开始弹出,直到堆栈上的下一个符号为+。优先级低于*(“下一个输入”),将*推送到堆栈并再次向前解析。您的堆栈看起来像(+*

你找到5并用它做你的事。如果你正在制作一个真正的计算器,我想通常你会有一个#2堆栈中的数字。现在,下一个输入符号为-,因此您将一直弹回,直到堆栈中的下一个符号再次为(。你再次停止弹出,因为你仍然有-作为下一个输入,等待右侧的任何内容。 (你假装有407存储在内存中,就像你刚刚弹出的那样。)

你向前解析,到达6并用它做你的事。下一个符号是),它不符合任何内部条件,因此您将其丢弃。如果你在堆栈中堆积了很多运算符,你会再次开始弹出,而只需打印-。现在,堆栈中的下一个符号再次为(。你弹出并丢弃它。

我猜这是应该如何运作的。