四个算术运算表达式求值的思路是用双栈来实现——栈nums存放值,栈ops存放运算符。该算法步骤对原始表达式字符串exp进行预处理,将其转换为一个值对应的元素或运算符列表explist。遍历explist,将每个元素依次压入对应的栈中。每次push后,判断当前两个栈顶是否可以进行乘除运算。栈顶进行乘除运算的充要条件是:ops栈顶是<*>,>之一,且nums中的元素恰好比ops中的元素多1。能运算就运算,运算结果推回nums。explist遍历后,所有的乘除运算都进行了。此时ops中只剩下加减法,然后开始另一个循环,继续运算即可。最后,nums中唯一剩下的元素是表达式的值。代码defoperation(a,b,op:str):"""计算一个操作的结果:parama:val:paramb:val:paramop:operator:return:val"""ifop=='+':returna+belifop=='-':returna-belifop=='*':returna*belifop=='/':returna/belse:raiseException('不正确的运算符')defexp_str2list(exp:str):"""将表达式exp:str转化为一个列表,每个元素对应一个数字或者一个运算符。已知exp是一个标准的四位表达式字符串算术运算。:paramexp:str,Expression:return:list"""opset={'+','-','*','/'}#operatorsetflag=-1explist=list()fori,charinenumerate(exp):#对于表达式字符串中的每个字符ifcharinopset:#如果char是一个运算符explist.append(exp[flag+1:i])#前一个运算符和当前运算符之间有一个数字,保存到explist中flag=i#更新flag为currentoppositionexplist.append(char)#当前op也加入explistexplist.append(exp[flag+1:])returnexplistdefcalculate_expression(exp:str):"""表达式求值。计算表示的表达式由字符串exp的值,返回一个已知的值exp是一个标准的四位算术表达式字符串,不带括号。:paramexp:str,expression:return:val"""opset={'+','-','*','/'}nums=list()#numberstackops=list()#operatorstackexplist=exp_str2list(exp)print(explist)foreinexplist:#epushintostackifeinopset:#ifeisanoperatorops.append(e)else:nums.append(eval(e))#如果e是高优先级的乘除方法,并且nums正好匹配ops,可以在栈顶进行一次计算,和T操作结果被按下Enternumsifopsandops[-1]in{'*','/'}andlen(nums)==len(ops)+1:op=ops.pop()y=nums.pop()x=nums.pop()nums.append(operation(x,y,op))#此时已经遍历了explist中的所有元素,并且进行了所有的乘除运算,在双栈中只剩下加法和减法计算。众所周知,加减法遵循结合律,接下来就是一路计算到底。whileops:op=ops.pop()y=nums.pop()x=nums.pop()x_op_y=operation(x,y,op)nums.append(x_op_y)returnnums[0]if__name__=='__main__':exp='1*43+542+532*432'print(calculate_expression(exp))print(eval(exp))参考资料CSDN:表达式求值——————Python大法好!https://blog.csdn.net/Hpuer_R...