python顺序列表模拟栈实现计算器
借助list中的append和pop模拟顺序栈的入栈和出栈
instack = {'+':1,'-':1,'*':3,'/':3,'%':3,'(':6,')':0}#栈外优先级
putstack={'+':2,'-':2,'*':4,'/':4,'%':4,'(':0,')':7}#栈中优先级
data_list=[]#数据栈
yunsuan_list=[]#运算符栈
str1=input()
ans=0#计算结果
ans_str1=''#中缀表达式
i=0
while i!=len(str1):
if str.isdigit(str1[i]):
for k in range(i,len(str1)):#用于取数据,因为可能包含小数所以数据中有'.'也是可行的
if str.isdigit(str1[k])==0 and str1[k]!='.':
data_list.append(eval(str1[i:k]))
ans_str1 += str(eval(str1[i:k]))+' '
i=K#更新遍历变量值
break
if k==len(str1)-1:#易错,处理最后一个数据没有之后的运算符作为边界,所以需要使用对应的序号作为最后数据结束的标识符
data_list.append(eval(str1[i:k+1]))
ans_str1 += str(eval(str1[i:k+1]))+' '
i=k+1
break
else:
while len(yunsuan_list)!=0 and putstack[yunsuan_list[-1]]>instack[str1[i]]:#当运算符栈非空且栈顶运算符在栈中的优先级大于当前栈外运算符优先级时。当运算符栈非空时要做处理时容易得到其数据栈至少有两个数据项,所以不需要单独判断数据栈数据的个数
l=data_list[-1]
data_list.pop()
r=data_list[-1]
data_list.pop()
data_list.append(eval(str(r) + yunsuan_list[-1] + str(l)))
ans_str1+=yunsuan_list[-1]+' '
yunsuan_list.pop()
if str1[i]!=')':
yunsuan_list.append(str1[i])
elif len(yunsuan_list)!=0 and yunsuan_list[-1]=='(':
yunsuan_list.pop()
i+=1#易掉
while len(yunsuan_list):#最后处理运算符栈中的运算符
l = data_list[-1]
data_list.pop()
r = data_list[-1]
data_list.pop()
data_list.append(eval(str(r) + yunsuan_list[-1] + str(l)))
ans_str1 += yunsuan_list[-1]+' '
yunsuan_list.pop()
print(ans_str1)#输出中缀表达式
print(data_list[-1])#输出结果
eg: