我必须将一个非完全括号的序列从中缀转换为后缀。这也需要使用堆栈。有一个堆栈供操作员存储。我需要确定运算符的优先级,以确保在转换的后缀序列中的正确位置打印正确的运算符。这是伪代码:
DO if(下一个输入是左括号) 阅读左括号并将其推入堆栈。 否则if(下一个输入是数字或其他操作数) 读取操作数并将其写入输出。 否则if(下一个输入是操作符号之一) { 在堆栈中弹出和打印操作,直到发生以下三种情况之一:(1) 堆栈变空,(2)堆栈中的下一个符号是左括号, 或(3)堆栈中的下一个符号是优先级低于的操作 下一个输入符号。当其中一种情况发生时,停止弹出,读取 下一个输入符号,并将此符号推入堆栈。 } 其他 { 读取并丢弃下一个输入符号(应该是右括号)。 从堆栈弹出和打印操作,直到堆栈中的下一个符号为a 左括号。 (如果未遇到左括号,则打印错误消息 表示不平衡的括号并停止。)最后,弹出并丢弃 左括号。 } 虽然(有更多的表达方式要阅读);
粗体文字对我来说是一个令人困惑的部分。有没有人对此采取何种方法?如果需要更多信息,请告诉我....
答案 0 :(得分:1)
似乎所描述的程序对我来说有点模糊,但我认为它说的是你有
...(2 + 3 ^ 4 * 5 - 6)...
您的筹码开始时看起来像(
所以你找到2
并用它做你的事情并找到+
。堆栈上的下一个符号是(
,因此您可以阅读+
并将其推入堆栈。现在你的堆栈看起来像(+
。
然后你找到3
,用它做你的事情然后继续寻找^
。这个描述听起来像是你可以开始在这里弹出,因为它符合第二个else if
,但你没有,因为你已经鼓起了什么。堆栈上的下一个符号是+
,优先级较低。你不知道^
之后的符号是什么,所以你无法开始弹出。相反,您将^
推送到堆栈并继续解析。您的堆栈看起来像(+^
。
你找到4
并用它做你的事。然后你向前解析,你找到*
。堆栈中的下一个符号是更高优先级,因此您开始弹出,直到堆栈上的下一个符号为+
。优先级低于*
(“下一个输入”),将*
推送到堆栈并再次向前解析。您的堆栈看起来像(+*
。
你找到5
并用它做你的事。如果你正在制作一个真正的计算器,我想通常你会有一个#2堆栈中的数字。现在,下一个输入符号为-
,因此您将一直弹回,直到堆栈中的下一个符号再次为(
。你再次停止弹出,因为你仍然有-
作为下一个输入,等待右侧的任何内容。 (你假装有407存储在内存中,就像你刚刚弹出的那样。)
你向前解析,到达6
并用它做你的事。下一个符号是)
,它不符合任何内部条件,因此您将其丢弃。如果你在堆栈中堆积了很多运算符,你会再次开始弹出,而只需打印-
。现在,堆栈中的下一个符号再次为(
。你弹出并丢弃它。
我猜这是应该如何运作的。