有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java确定数学运算符的优先级

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

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

黑体字对我来说是令人困惑的部分。有人对此有什么建议吗?如果需要更多信息,请告诉我


共 (1) 个答案

  1. # 1 楼答案

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

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

    你的堆栈开始看起来像(

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

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

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

    你找到5并用它做你的事。我想如果你在做一个真正的计算器,通常你会有一个#2堆栈,里面有数字。现在,下一个输入符号是-,所以您可以一直向后弹出,直到堆栈上的下一个符号再次是(。你停止再次弹出,因为你仍然有-作为下一个输入等待右边的任何东西。(你在假装自己的内存中存储了407,而不是刚刚弹出的文件。)

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

    我猜应该是这样的