任务:
编程实现中缀算术表达式转换为逆波兰表达式
输入:中缀式
输出:逆波兰式
只考虑简单运算式,包括四种运算符+-*/
基本思路:
1.定义一个栈,最初栈为空;
2、定义s1串,放入中缀表达式,表达式以#结尾;
3、定义s2串,用来放入逆波兰表达式;
4、从头到尾地扫描中缀表达式( s1串)中的每个字符,对于不同类型的字符按以下情况进行处理: (1)若遇到的是空格则认为是分隔符,不需要进行处理; (2)若遇到的是操作数直接写入s2串中(3)若遇到的是运算符: 如果栈为空,直接入栈; 当该运算符的优先级大于栈顶运算符的优先级(加减运算符的优先级设定为1,乘除运算符的优先级设定为2)时,表明该运算符的后一个运算对象还没有被扫描并放入到s2串中,应把它暂存于栈中,待它的后一个运算对象从s1串中读出并写入到s2串中后,再令其出栈并写入s2串中;若遇到的运算符的优先级小于等于栈顶运算符的优先级,这表明栈顶运算符的两个运算对象已经被保存到s2串中,应将栈顶运算符退栈并写入到s2串中,对于新的栈顶运算符仍继续进行比较和处理,直到被处理的运算符的优先级大于栈顶运算符的优先级为止,然后令该运算符进栈即可。(4)如果s1串扫描完毕,栈内有运算符,依次出栈,写入s2串。 (5)输出s2串。
注意:
栈中:
#!/use/bin/python
# _*_ coding: UTF-8 _*_
"""
@author:YLFeng
@file:逆波兰式
@time:2022/9/28 18:30
"""
class Stack():
def __init__(self,size):
self.size=size
self.stack=[]
self.top=-1
self.bottom=-1
def push(self,x):
if self.isfull():
print("stack is full")
return False
else:
self.stack.append(x)
self.top=self.top+1
return True
def pop(self):
if self.isempty():
print("stack is empty")
return False
else:
self.top=self.top-1
self.stack.pop()
return True
def get(self,y):
if self.top!=-1:
return self.stack[self.bottom+int(y)]
def gettop(self):
if self.top!=-1:
return self.stack[self.top]
def isempty(self):
return self.top=='-1'
def isfull(self):
return self.top+1==self.size
def showStack(self):
print(self.stack)
s1=str(input())
a=Stack(len(s1))
s2=""
#for i in range(100):
# n=input()
# if n=="#":
# break
# a1.push(n)
for j in range(1,len(s1)+1):
m=s1[j-1:j]
if m=='+' or m=='-' or m=='*' or m=='/':#运算符
if a.top==-1:#有问题T or F
a.push(m)
elif a.get(len(a.stack))=='*' or a.get(len(a.stack))=='/':
while a.top!=-1:
s2 = s2 + str(a.gettop())
a.pop()
a.push(m)
elif a.get(len(a.stack))=='+' or a.get(len(a.stack))=='-':
if m=='*' or m=='/':
a.push(m)
else:
s2=s2+str(a.gettop())
a.pop()
a.push(m)
elif m != '*' and m != '/' and m != '+' and m != '-': # 直接读入操作数
s2 = str(s2+m)
for i in range(1,a.top+2):
if a.top!=-1:
s2=str(s2+str(a.gettop()))
a.pop()
else:
break
print(s1)
print(s2)
#a.showStack()
#print(len(a.stack))
结果: