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

该博客介绍了如何使用Python通过顺序列表模拟栈来实现一个简单的中缀表达式计算器。文章详细讲解了如何处理运算符的优先级,包括括号的处理,并给出了完整的代码实现。内容涵盖了数据栈和运算符栈的管理,以及最终结果的计算和输出。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

看不见的罗辑

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

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

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

打赏作者

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

抵扣说明:

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

余额充值