【Python】洛谷 P1175_表达式的转换(逆波兰式、中缀表达式、后缀表达式、栈)

本文讲述了作者在复习栈数据结构时遇到的RuntimeError问题,通过发现输入数据中的空格并使用strip()解决,进而探讨了中缀表达式转后缀表达式的栈实现。重点在于代码调试和数据处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

image-20210331224741110

代码

碎碎念:我用来复习栈的,刷了巨长时间,一直Runtine Error,编译直接就没有过。
好家伙,然后发现是数据给的不够严谨,左右两端有空格,使用strip()处理一下就好了。

# 栈结构
class Stack:
    def __init__(self,*args):
        self.items = [i for i in args]
    def __str__(self):
        return str(self.items)
    def push(self,item):
        self.items.append(item)
    def pop(self):
        return self.items.pop()
    def is_empty(self):
        return self.items == []
    def peek(self):
        return self.items[-1]
        # 返回最后一个元素
    def size(self):
        return len(self.items)
    def show(self):
        return self.items
    def clear(self):
        self.items = []
        

# 中缀表达式 => 后缀表达式
# LG P1175 表达式的转换

def change_expression(s: str):
    dic = {
        "(": 0,
        "^": 3,
        "*": 2,
        "/": 2,
        "+": 1,
        "-": 1
    }
    stack = Stack()  # 存储符号
    res = []  # 放答案
    for i in s:
        # 操作符
        if i in ['+', '-', '*', '/', '^']:
            # 要先取出优先级更高的,或者相等的运算符
            while (not stack.is_empty() and dic[stack.peek()] >= dic[i]):
                res.append(stack.pop())
            stack.push(i)
        elif i == '(':
            stack.push(i)
        elif i == ')':
            top_token = stack.pop()
            while (top_token != '('):
                res.append(top_token)
                top_token = stack.pop()
        else:
            # 运算数
            res.append(i)
    # 剩余元素全部加入
    while not stack.is_empty():
        res.append(stack.pop())

    return " ".join(res)


def calc_postfix_expression(s: str):
    # 计算后缀表达式
    stack = Stack()

    # start 方便输出
    temp = list(s)
    index = 0
    # end 方便输出

    for i in s:
        if i in "0123456789":
            # 运算数
            stack.push(int(i))
        else:
            # 运算符
            op2 = stack.pop()
            op1 = stack.pop()
            ans = do_math(i, op1, op2)
            stack.push(ans)
            # start 输出依次结果
            before = temp[0:index-2]
            before.append(str(ans))
            out = before + temp[index+1:]
            temp = out
            index = index - 2
            print(" ".join(out))
            # end 输出结果
        index += 1

    return stack.pop()


def do_math(op, op1, op2):
    if op == '+':
        return op1+op2
    elif op == '-':
        return op1-op2
    elif op == '*':
        return op1*op2
    elif op == '/':
        return op1//op2
    elif op == '^':
        return op1**op2


if __name__ == '__main__':
    # 对于题目中的输入字符串一定要小心(如果比赛题目不严谨,会导致很多问题,最后strip()一下)
    expression = input().strip()
    res = change_expression(expression)
    # res = change_expression("(1+2)*3-4")
    print(res)  # 输出结果
    calc_postfix_expression(res.replace(" ", ""))
    # print(ans)

AC截图

image-20210331224704889

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏2同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值