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

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

代码实现

class Solution:

def calculate(self, s: str):

定义栈

stack = []

用于记录上一次运算符

pre_operator = ‘+’

用于记录运算符前面的值

num = 0

for c in (s+‘+’):

如果c是空白符直接跳过

if c == " ":

continue

如果c是数字

if c.isdigit():

可使用ord相减也可使用int©

num = num*10 + ord© - ord(‘0’)

如果c是运算符

elif c in “±*/”:

if pre_operator == ‘+’:

stack.append(num)

elif pre_operator == ‘-’:

stack.append(-num)

elif pre_operator == ‘*’:

栈顶元素与运算符前的数字相乘

stack[-1] = stack[-1]*num

elif pre_operator == ‘/’:

要使表达式更加精确,可写成stack[-1] = format((stack[-1]/num),‘.5f’)

stack[-1] = int(stack[-1]/num)

初始化

num = 0

记录此时的运算符

pre_operator = c

return sum(stack)

二、双栈


当表达式更为复杂时可使用双栈解法。双栈目前支持的输入的字符有0~9,±*/,(),双栈可应对较为复杂的表达式,如"3+6/-2"两运算符连续出现以及多括号嵌套"(10/(4*2+2)-3)*(4-8)"等情况。而单栈适用于常规计算,处理快易上手,二者各有优点。

单双栈异同点

双栈计算与单栈计算过程有许多相似之处。

  • 都是遇到下一运算符才计算上一个运算符。

  • 获取数字思路一致,都是不断遍历字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值