-1

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

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

粗体字对我来说是令人困惑的部分。有没有人对此方法有建议?如果需要更多信息,请告诉我......

4

1 回答 1

1

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

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

你的堆栈开始看起来像(

所以你找到2并用它做你的事情并找到+。堆栈上的下一个符号是(让您读取+并将其压入堆栈。现在你的堆栈看起来像(+.

然后你找到3,用它做你的事,然后继续寻找^。描述听起来像是你可以在这里开始弹出,因为它遇到了第二个else if,但你没有因为你的胆量而没有。堆栈上的下一个符号是+and 的优先级较低。你不知道后面的符号^是什么所以你还不能开始弹出。相反,您推入^堆栈并继续解析。你的堆栈看起来像(+^.

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

你找到5并用它做你的事。我猜如果你正在制作一个真正的计算器,我猜通常你会有一个带有数字的#2堆栈。现在下一个输入符号是-这样你一直弹出,直到堆栈上的下一个符号(再次出现。您不再弹出,因为您仍然有-下一个输入等待右侧的任何内容。(你假装你有 407 存储在你刚刚弹出的某个地方的内存中。)

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

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

于 2013-10-21T22:30:20.797 回答