python eval函数——求解字符串表达式 算法实现思路(1)

本文介绍了Python中计算字符串表达式的两种方法:单栈和双栈算法。针对简单表达式,如'3+2*5-4/2',可以使用单栈,遇到运算符时对前面的数字进行操作。对于更复杂的表达式,双栈算法能处理括号和连续运算符,考虑运算符优先级。文章详细阐述了两种算法的思路、代码实现和特殊情况,提供了模拟图解帮助理解。
摘要由CSDN通过智能技术生成

一、单栈

思路

代码实现

二、双栈

单双栈异同点

思路

特殊情况

★模拟图解

代码实现


说明

==

应对不同情况下的字符串表达式求值,本篇提供双栈和单栈两种解法。当表达式较为简单不存在括号时,可使用单栈求解,其他情况使用双栈。

算法

==

一、单栈


当表达式不存在括号时,如"3+2*5-4/2"可使用单栈求解。

思路

我们遍历表达式,每遇到一个运算符就对运算符前面的数字进行相应操作。

定义了一个栈,将消除乘除号后的数字添进栈中,最后使用sum方法将栈内元素求和得出最终结果。

  • 当遇到"+"号时,将符号前面的数字(称为num)压入栈中

  • 当遇到"-"号时,将(-num)压入栈中

  • 当遇到"*“号时,将栈顶元素与”*"号后面的数字相乘得出的结果赋值给栈顶元素

  • 当遇到"/“号时,将栈顶元素与”/"号后面的数字相除得出的结果赋值给栈顶元素

可以看到“±”号性质相似,“*/”号性质相似,因此处理过程无非就两种形式。

**思考:**如何获取运算符后面数字的值?获取该值后是否会对下一次运算结果造成影响?我们是否应该对表达式后面的值进行操作而不是前面的?

思考完上面的问题后,我先回答第三个问题,**这里的数值在表达式前后只是相对而言,参考的位置不一样,数字所在前后就不一样。**没有必要纠结数字到底是在运算符前面还是后面。我们获取num的值是以运算符出现作为判断依据的,也就是说数字后面出现运算符的时候说明这个数字获取完成了。(那么此时可以说数字在运算符前面)

解决前面两问题的其中一个做法是定义一个变量(pre_operator)记录上一次运算符的值,当遇到一个运算符不着急处理,等下一次再出现运算符后才对这一次数据进行处理。我们规定pre_operator 的初始值是加号(加号的操作是将值压入栈中),因为我们是要等下一次出现运算符后再对前一次数据处理,当遍历到表达式末尾时,如果最后面没有一个运算符我们就无法获取最后一个计算结果了,因此要在表达式后面任意加一个运算符。

代码实现

class Solution:

def calculate(self, s: str):

定义栈

stack = []

用于记录上一次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值