四则运算表达式part2(根据后缀表达式计算数值)

part1已经将中缀表达式(四则运算表达式)转换成了后缀表达式。这一部分主要是讲利用后缀表达式求值。

四则运算表达式:1+2*3+(4*5+6)-10的后缀表达式为123*+45*6++10-。具体看part1。

将后缀表达式依次入栈stack。

1.数字直接入栈stack=【1,2,3】。

2.遇操作符*出栈两个元素【3,2】,计算出栈第二个元素(操作符)出战第一个元素。此处计算出为2*3=6.将6入栈。stack=【1,6】

3.与操作符+,同上。处理完为7,入栈。stack=【7】

4.与数字4,5,直接入栈。stack=【7,4,5】

5.遇操作符*,出栈并处理得20,入栈。stack=【7,20】

6.遇数字6入栈。stack=【7,20,6】

7.遇操作符+,出栈元素并处理得26,入栈。stack=【7,26】

8.遇操作符+,出栈处理得33。stack=【33】

9.遇10,入栈。stack=【33,10】

10.遇操作符-。出栈处理得33-10=23。

故最后的四则表达式的结果为23.

最后python代码实现如下:

def compare(op1, op2):
    return op1 in ["*", "/"] and op2 in ["+", "-"]
def getvalue(num1, num2, operator):
    if operator == "+":
        return num1 + num2
    elif operator == "-":
        return num1 - num2
    elif operator == "*":
        return num1 * num2
    else:
        return num1 / num2
def process(data, opt):
    operator = opt.pop()
    num2 = data.pop()
    num1 = data.pop()
    data.append(getvalue(num1, num2, operator))
def shift(s):
    opt=[]
    data=[]
    i=0
    while i<len(s):
        if s[i].isdigit():#如果是数字就进数字栈
            start=i
            while i+1<len(s) and s[i+1].isdigit():
                i=i+1
            data.append(int(s[start: i + 1])) 
        elif s[i]==")":#如果进栈的是右括号,就处理到栈顶元素是左括号为止。数字出栈两个,然后符号栈出栈一个。
            while opt[-1] != "(":
                process(data, opt)
            opt.pop()
        elif not opt or opt[-1] == "(":#如果操作符栈为空,或者操作符的栈顶不是左括号
            opt.append(s[i])
        elif s[i] == "(" or compare(s[i], opt[-1]):#如果是s[i]的优先级高于栈顶元素
            opt.append(s[i])
        else:
            while opt and not compare(s[i], opt[-1]):#如果s[i]优先级低于栈顶元素,就出栈
                if opt[-1] == "(":#出栈到括号为止
                    break
                process(data, opt)
            opt.append(s[i])
        i += 1
    while opt:
        process(data, opt)
    return (data.pop())

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值