eval?python顺序列表模拟栈实现计算器

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:在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看不见的罗辑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值