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