[python]将中缀表达式(infix)转换为后缀表达式(postfix)

将中缀表达式(infix)转换为后缀表达式(postfix)

算法描述

  1. 第一种情况,表达式不含括号。

    假设存在一个函数prcd(op1,op2),其中op1和op2是两个操作符(在中缀表达式中,op1在op2的左边),如果op1的优先级高于或等于op2,函数返回True,否则返回False。例如:

    prcd('\*','+') --> True
    
    prcd('+','-') --> True
    
    prcd('\*','/') --> True
    
    prcd('-','*') --> False
    

    考虑表达式 A+B*C。当扫描到A时,将A添加到postfix中,接着遇到‘+’操作符,此时,由于只有一个操作数,‘+’只能先存入栈stack中;当扫描到B时,将其追加至postfix;接着遇到*,栈不为空,那么调用pcdr(pop(stack),’*’),因为‘+’优先级低于‘*’,返回False,将‘*’压入栈中,push(stack,’*’),接着遇到C,将其追加至postfix。这时,表达式扫描完,栈仍不为空,依次pop出数据,追加至postfix。最终结果为‘BC*A+’

  2. 第二种情况,表达式含有括号。

    当扫描到‘(’时,将其压入堆栈,这可以通过使prcd

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用栈来实现中缀表达式转换后缀表达式。 具体步骤如下: 1. 初始化一个栈和一个空列表,用于存放后缀表达式; 2. 从左到右遍历中缀表达式中的每个元素; 3. 如果当前元素是数字或字母,则直接将其添加到后缀表达式列表中; 4. 如果当前元素是左括号"(",则将其压入栈中; 5. 如果当前元素是右括号")",则不断将栈顶元素弹出并添加到后缀表达式列表中,直到遇到左括号"("为止,然后将左括号弹出栈; 6. 如果当前元素是运算符,则不断将栈顶元素弹出并添加到后缀表达式列表中,直到栈顶元素优先级低于等于当前元素,然后将当前元素压入栈中; 7. 遍历完中缀表达式后,如果栈中还有元素,则不断将栈顶元素弹出并添加到后缀表达式列表中。 具体实现代码如下: ```python def infix_to_postfix(infix): # 定义运算符优先级 priority = {'+': 1, '-': 1, '*': 2, '/': 2, '^': 3} # 初始化栈和后缀表达式列表 stack = [] postfix = [] # 遍历中缀表达式中的每个元素 for token in infix: # 如果当前元素是数字或字母,则直接将其添加到后缀表达式列表中 if token.isalnum(): postfix.append(token) # 如果当前元素是左括号"(",则将其压入栈中 elif token == '(': stack.append(token) # 如果当前元素是右括号")",则不断将栈顶元素弹出并添加到后缀表达式列表中,直到遇到左括号"("为止,然后将左括号弹出栈 elif token == ')': while stack[-1] != '(': postfix.append(stack.pop()) stack.pop() # 如果当前元素是运算符,则不断将栈顶元素弹出并添加到后缀表达式列表中,直到栈顶元素优先级低于等于当前元素,然后将当前元素压入栈中 else: while stack and stack[-1] != '(' and priority[token] <= priority.get(stack[-1], 0): postfix.append(stack.pop()) stack.append(token) # 遍历完中缀表达式后,如果栈中还有元素,则不断将栈顶元素弹出并添加到后缀表达式列表中 while stack: postfix.append(stack.pop()) return postfix ``` 使用示例: ```python infix = '3+4*2/(1-5)^2^3' postfix = infix_to_postfix(infix) print(postfix) # ['3', '4', '2', '*', '1', '5', '-', '2', '^', '3', '^', '/', '+'] ``` 最终得到的后缀表达式为:3 4 2 * 1 5 - 2 ^ 3 ^ / +

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值