后缀表达式(算法)

求解具有优先级的表达式时,我们会选择前缀表达式和后缀表达式,这样就需要将中缀表达式转换成前缀或者后缀表达式,转换方式如下:
1、创建两个栈,数据栈和符号栈
2、遍历字符串
3、如果当前是数据,直接存入数据栈
4、如果当前是左括号,直接存入符号栈
5、如果当前是右括号,循环弹出符号栈进入数据栈,直到输出左括号为止
6、如果当前是其它符号,循环符号栈的栈顶优先级高于当前符号则弹出进入数据栈

实现代码如下:

# 后缀表达式

s = '1+2*(2+3)*5-2'

stack = []
nums = []
i = 0
n = len(s)

while i < n:
    w = s[i]
    print(w,stack)
    if w == '(':
        stack.append(w)
    elif w in '+-*':
        if w in '+-':
            while stack and stack[-1] == '*':
                nums.append(stack.pop())
            stack.append(w)
        else:
            stack.append(w)
    elif w == ')':
        while stack[-1] != '(':
            nums.append(stack.pop())
        stack.pop()
    else:
        cur = 0
        while i < n and s[i].isdigit():
            cur = cur * 10 + int(s[i])
            i += 1
        nums.append(cur)
        continue
    i += 1
while stack:
    nums.append(stack.pop())

i = 0
n = len(nums)
stack = []
while i < n:
    w = nums[i]
    if isinstance(w,int):
        stack.append(w)
        i += 1
    else:
        if w == '+':
            stack.append(stack.pop()+stack.pop())
        elif w == '-':
            stack.append(-stack.pop()+stack.pop())
        else:
            stack.append(stack.pop()*stack.pop())
        i += 1
print(stack)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中缀表达式转后缀表达式算法可以分为两种,一种是使用栈来实现,另一种是使用逆波兰算法。这两种算法的目的都是将中缀表达式转换为后缀表达式,以便于计算表达式的值。下面分别介绍这两种算法的内容和实现。 1. 使用栈实现中缀表达式转后缀表达式算法: (1)从左到右遍历中缀表达式中的每个元素,如果是操作数,则直接输出;如果是操作符,则进行如下处理: (2)如果栈为空或者栈顶元素为左括号,则将操作符入栈。 (3)如果操作符的优先级大于栈顶元素的优先级,则将操作符入栈。 (4)否则,将栈顶元素弹出并输出,然后重复步骤(3)。 (5)如果遇到左括号,则将其入栈;如果遇到右括号,则将栈顶元素弹出并输出,直到遇到左括号为止。 (6)重复步骤(1)至(5),直到遍历完整个中缀表达式。 (7)如果栈中还有元素,则依次弹出并输出。 2. 使用逆波兰算法实现中缀表达式转后缀表达式算法: (1)从左到右遍历中缀表达式中的每个元素,如果是操作数,则直接输出;如果是操作符,则进行如下处理: (2)如果操作符的优先级大于栈顶元素的优先级,则将操作符入栈。 (3)否则,将栈顶元素弹出并输出,然后重复步骤(2)。 (4)如果遇到左括号,则将其入栈;如果遇到右括号,则将栈中所有操作符弹出并输出,直到遇到左括号为止。 (5)重复步骤(1)至(4),直到遍历完整个中缀表达式。 (6)如果栈中还有元素,则依次弹出并输出。 这两种算法都可以将中缀表达式转换为后缀表达式,以便于计算表达式的值。使用栈实现的算法比较简单易懂,逆波兰算法则更加高效,可以直接通过栈来计算后缀表达式的值,而不需要考虑运算符的优先级和结合性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值