中缀转后缀表达式、逆波兰表达式、leetcode224、227

中缀转后缀表达式python leetcode224、227

class Solution:
    def calculate(self, s):           # 中缀转后缀
        def evalRPN(tokens):
            stack = []
            for token in tokens:
                if token.isnumeric() or token[0]=="-" and token[1:].isnumeric():
                    stack.append(token)
                else:
                    x = int(stack.pop())
                    y = int(stack.pop())
                    if token == "-":
                        stack.append(y-x)
                    elif token == "+":
                        stack.append(y+x)
                    elif token == "*":
                        stack.append(y*x)
                    elif token == "/":
                        stack.append(y/x)
            return int(stack[-1])
        op_priority = {'+': 0, '-': 0, '*': 1, '/': 1, '%': 1, '^': 2}      # 定义操作符优先级
        if s[0] == "-": s="0"+s       # 第一个数字是负数
        s = "(" + s.replace(" ", "").replace("(-", "(0-").replace("--","+").replace("+-","-") + ")"   # 注:不能解决*-/-
        n = len(s)
        op_stack = []    # 符号操作栈
        RPN = []         # 后缀表达式
        i = 0
        while i < n:
            c = s[i]     # 当前字符
            i += 1       # 下一个字符
            if c.isdigit():
                num = int(c)  # 当前字符
                while i < n and s[i].isdigit(): # 下一个字符
                    num = num * 10 + int(s[i])
                    i += 1
                RPN.append(str(num))
            elif c == '(':  # (
                op_stack.append(c)
            elif c == ')':  # calculate until see '('
                while op_stack and op_stack[-1] != '(':
                    RPN.append(op_stack.pop())
                op_stack.pop()
            else:
                while op_stack and op_stack[-1] != '(':
                    if op_priority[c] <= op_priority[op_stack[-1]]:
                    	RPN.append(op_stack.pop())
                    else:
                        break
                op_stack.append(c)
        return evalRPN(RPN)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值