中缀表达式:(A+B)*(C+D)[人的逻辑]
后缀表达式:A B + C D + * [计算机的逻辑]
可以使用栈的方式实现转换。
程序写完后,发现无论输入什么,输出都是中缀表达式。
后来调试发现是程序中的split()函数的原因。
str.split(str="", num=string.count(str)).
·str:分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
·num:分割次数。
默认为空格进行分隔,所以在输入时要注意加上空格,如:
加上空格:( A + B ) * ( C + D )
没加空格:(A+B)*(C+D)
代码如下:
'''
1.创建空栈,以及一个用于保存结果的列表
2.使用split()将输入的表达式分为多个元素
3.从左向右扫描表达式:
(1)如果是字母,添加到结果列表
(2)如果是左括号,左括号进栈
(3)如果是右括号,循环出栈,遇到左括号停止。栈中的运算符添加到结果列表
(4)如果是运算符,进栈,但在进栈之前,若栈顶运算符优先级 >= 当前运算符,
栈顶运算符出栈,并添加到结果列表,当前运算符进栈
4.检查栈,将剩余的运算符添加至结果列表
'''
from pythonds.basic import Stack
import string
def operation(maths):
signgrade = {'*':3,'/':3,'+':2,'-':2,'(':1} #运算符优先级
s = Stack() #空栈
maths = maths.split() #拆分符号,split()默认为空格拆分
signlist = [] #保存结果的列表
for math in maths:
if math in string.ascii_uppercase:
signlist.append(math)
elif math == '(': #如果是左括号,进栈
s.push(math)
elif math == ')': #如果是右括号,
Math = s.pop() #从栈中移除元素,
while Math != '(': #遇到左括号停止
signlist.append(Math) #将移除的元素添加到列表
Math = s.pop()
else:
while (not s.isEmpty()) and \
(signgrade[s.peek()] >= signgrade[math]): #若栈顶优先级>=当前运算符优先级
signlist.append(s.pop()) #栈顶出栈加入列表
s.push(math) #当前运算符进栈
while not s.isEmpty(): #检查栈,将所有剩余的运算符添加至结果列表
signlist.append(s.pop())
return ','.join(signlist) #','.join()将序列中的元素以指定的字符连接生成一个新的字符串。
如有问题,请大家改正!