part1已经将中缀表达式(四则运算表达式)转换成了后缀表达式。这一部分主要是讲利用后缀表达式求值。
四则运算表达式:1+2*3+(4*5+6)-10的后缀表达式为123*+45*6++10-。具体看part1。
将后缀表达式依次入栈stack。
1.数字直接入栈stack=【1,2,3】。
2.遇操作符*出栈两个元素【3,2】,计算出栈第二个元素(操作符)出战第一个元素。此处计算出为2*3=6.将6入栈。stack=【1,6】
3.与操作符+,同上。处理完为7,入栈。stack=【7】
4.与数字4,5,直接入栈。stack=【7,4,5】
5.遇操作符*,出栈并处理得20,入栈。stack=【7,20】
6.遇数字6入栈。stack=【7,20,6】
7.遇操作符+,出栈元素并处理得26,入栈。stack=【7,26】
8.遇操作符+,出栈处理得33。stack=【33】
9.遇10,入栈。stack=【33,10】
10.遇操作符-。出栈处理得33-10=23。
故最后的四则表达式的结果为23.
最后python代码实现如下:
def compare(op1, op2):
return op1 in ["*", "/"] and op2 in ["+", "-"]
def getvalue(num1, num2, operator):
if operator == "+":
return num1 + num2
elif operator == "-":
return num1 - num2
elif operator == "*":
return num1 * num2
else:
return num1 / num2
def process(data, opt):
operator = opt.pop()
num2 = data.pop()
num1 = data.pop()
data.append(getvalue(num1, num2, operator))
def shift(s):
opt=[]
data=[]
i=0
while i<len(s):
if s[i].isdigit():#如果是数字就进数字栈
start=i
while i+1<len(s) and s[i+1].isdigit():
i=i+1
data.append(int(s[start: i + 1]))
elif s[i]==")":#如果进栈的是右括号,就处理到栈顶元素是左括号为止。数字出栈两个,然后符号栈出栈一个。
while opt[-1] != "(":
process(data, opt)
opt.pop()
elif not opt or opt[-1] == "(":#如果操作符栈为空,或者操作符的栈顶不是左括号
opt.append(s[i])
elif s[i] == "(" or compare(s[i], opt[-1]):#如果是s[i]的优先级高于栈顶元素
opt.append(s[i])
else:
while opt and not compare(s[i], opt[-1]):#如果s[i]优先级低于栈顶元素,就出栈
if opt[-1] == "(":#出栈到括号为止
break
process(data, opt)
opt.append(s[i])
i += 1
while opt:
process(data, opt)
return (data.pop())