关于中缀转后缀的详细说明

版权声明:本文为博主原创文章,未经博主允许可以转载。 https://blog.csdn.net/killeri/article/details/83245526

我们还是不要考虑符号的问题,遇到数字直接往列表里加就好了。

我们通过比较两个符号优先级来确定该符号应不应该从栈中弹出,换句话说就是我们考虑的就是以怎么样的方式从栈中弹出符号。

这样的话,我们首先栈里要有元素对吧,然后我们通过比较优先级它与接下来符号的优先级来确定要不要从栈中弹出这个符号。
我们首先确定一下优先级:

priority = {"+": 3, "-": 3, "*": 5, "/": 5}

然后是一个中缀的例子:

infix = "5 + 4 * 3 / 2 - 1"

接下来是一个存储符号的栈:

s = Stack()

一个存储后缀表达式的表

suffix = []

通过这个例子来一步步说明这个转换过程!

首先,遇到数字5,我们直接将他存储到suffix的表里

suffix.append(5)

接下来就是第一个运算符 +
由于我们比较的是栈中的运算符与它后面的符号的优先级,栈中没有运算符总不行吧,所以当栈是空的时候,我们就把一个运算符压进去。

if s.is_empty():
	s.push(+)
# 这里注意,只要栈是空的我们就必须压一个符号进去

现在栈里有符号了,我们就要比较它与式子中下一个符号的优先级顺序,我们设在栈中的符号的优先级是x, 下一个符号的优先级是y,比较顺序结果如下:

  • 如果x > y,我们把栈中的符号弹出来,放到后缀表达式中,y继续与栈中的其他符号的优先级进行比较,直到比较出一个优先级与它相同的符号,容易证明这个符号就是栈中的最后一个元素(这个后面解释)
  • 如果x < y,那我们不弹出元素,反而将y所代表的元素压进栈中。
  • 如果x = y,我们也弹出栈中的元素,然后继续和栈中的其他符号进行比较,直到比较出一个优先级比它小的,或者栈为空将y压入栈

现在来说一下为什么就是最后一个元素了!

通过上面的规则,只有一种可能栈中存在一个以上的符号,那就是 栈中的唯一一个符号的优先级小于接下来一个符号的优先级,这样栈中才能有多于一个符号,仔细分析规则可知,栈中的符号也不可能多于两个。

这样我们来分析代码:

symbols = '+-*/'
for i in line:
	if i not in symbols:
		suffix.append(i)
	elif s.is_empty():
		s.push(i)
	else:
		while priority[i] <= priority[s.top()] and not s.is_empty():
			suffix.append(s.pop())
		s.push(i)
while not s.is_empty():
		suffix.append(s.pop())

以上代码,完全是使用思路想出来的,也就是伪代码的实现。但没有考虑括号,接下来我们考虑一下有括号的情况。

当我们一个符号与一个括号相连时,肯定是先算这个括号里面,然后再是相连的符号。

猜你喜欢

转载自blog.csdn.net/killeri/article/details/83245526