2013-10-21 47 views
-1

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

do if(下一个输入是左括号) 读取左括号并将其推入堆栈。 else if(下一个输入是数字或其他操作数) 读取操作数并将其写入输出。 else if(下一个输入是其中一个操作符号) 弹出和打印操作直到出现以下三种情况之一:(1) 堆栈变空,(2)堆栈上的下一个符号为左括号 或(3)堆栈中的下一个符号的优先级低于下一个输入符号的优先级为 的操作。当其中一种情况发生时,停止弹出,读取下一个输入符号 ,并将此符号推入堆栈。 } else 读取并丢弃下一个输入符号(应该是右括号)。 从堆栈中弹出并打印操作,直到堆栈中的下一个符号为 左括号。 (如果没有遇到左括号,则打印一条错误消息 ,指示不平衡的圆括号并停止。)最后,弹出并丢弃左括号。 } while(there is more of the expression to read);

加粗的文字对我来说是令人困惑的部分。有没有人有对此方法的建议?让我知道,如果需要更多的信息.​​...

+1

我认为这是算法/数据结构作业吗?无论如何,我不确定混淆粗体文本是什么 - 简而言之,它告诉你将低优先级操作符留在堆栈上,并在其上添加下一个输入符号/标记。通过这种方式,您可以将操作员从堆栈中弹出并按照正确的顺序到达。是否由于对运算符优先级缺乏理解而产生混淆?几乎所有的语言都清楚地记录了这一点;例如,Java有一个[你可以参考的表](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html)。 –

回答

1

好像描述的过程是有点含糊,我也一样,但我认为它是什么说的是说你有

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

和你的筹码开始off看起来像(

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

然后你发现3,做你的事情,并继续找到^。说明听起来像你可以开始在这里弹出,因为它符合第二个else if,但你不是因为你的底气。堆栈中的下一个符号是+,优先级较低。你不知道之后的^是什么,所以你不能开始弹出。相反,你推^到堆栈并保持解析。你的堆栈看起来像(+^

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

你找到5并用它做你的事情。如果你正在制作一个真正的计算器,我想通常你会得到一个包含数字的#2堆栈。现在下一个输入符号是-,所以您一直弹出,直到堆栈中的下一个符号再次变为(。你停止再次弹出,因为你仍然有-作为下一个输入等待右边的任何东西。 (你假装你已经把它存储在内存中,从你刚刚做的那个弹出的地方)。

你解析向前,进入6,并用它做你的事情。下一个符号是),它不符合任何内部条件,因此您放弃它。如果你在这里堆放了一大堆操作员,你会再次开始弹出,但是你只需打印-。现在堆叠中的下一个符号再次是(。你弹出并丢弃它。

我猜这就是它应该如何工作。