什么是后缀(前缀)表达式:我们所熟知的表达式,如1+1,1*5+1,2*3,(3+2)*8
这类的表达式其实都称为是中缀表达式,通过我们所约定俗成的规则——运算符优先级大的先算,来进行表达式的计算。然而计算机并不知道我们的这种规则,于是出现了后缀(前缀)表达式,如1+1转化为后缀表达式就是11+,(3+2)*8转化为后缀表达式就是32+8*。这种方法就有利于计算机的计算。
题目:将一个只含四则运算的中缀表达式转化为后缀表达式
如(1+1)*(9+9)等等
思路:不妨先写几个后缀表达式出来看看,题目中的案例转化为后缀就是11+99+*,1*1转化为11*,不难发现运算符都位于被运算字符的后面,并且优先级越低的运算符越后面,由此可以想到利用栈的后进先出来实现这个算法。
扫描表达式,将运算字符放入答案列表中,遇到左括号时,压入栈,遇到右括号时,不断弹出栈内元素直到弹出左括号。遇到运算符时,先判断栈顶有无高优先级的运算符,有则弹出高优先级运算符,无则压入该运算符。最后扫描完,弹出栈内全部元素。
代码实现:
text = ['5','*','6','+','4']
answer = []
text_stock = []
for i in text:
if i == '(' or i == '*' or i == '/': #(*/ 可以直接压入
text_stock.append(i)
elif i in '123456789':
answer.append(i) #数字直接放到最后答案中
elif i == ')':
stockTOP1 = text_stock[-1] #)需要匹配(,不断弹出栈顶元素直到匹配到元素
while stockTOP1 != '(':
answer.append(stockTOP1)
text_stock.pop()
stockTOP1 = text_stock[-1]
text_stock.pop()
else: #最后判断+-号,栈顶没有*/则直接压入,有*/则弹出*/然后压入
stockTOP2 = text_stock[-1]
if stockTOP2 != '*' and stockTOP2 != '/':
text_stock.append(i)
else:
answer.append(stockTOP2)
text_stock.pop()
text_stock.append(i)
for s in text_stock: #最后遍历栈,弹栈输出答案
answer.append(s)
print(''.join(answer))
总结:表达式转化与前面所说到的二进制转化与括号匹配在代码上难度更高,但是总体的思路不变,都是利用栈来做到次序转化。这种次序转化就是先输入的东西不一定先输出,而是判断后再输出,造成的先入后出的现象,就叫做次序转化。
二进制转化与括号匹配可以看我上一篇《数据结构之栈》【从零开始学算法】数据结构之栈__焱_的博客-CSDN博客