python怎么将中缀改写成后缀
时间: 2024-05-05 16:15:58 浏览: 6
中缀表达式转后缀表达式的步骤如下:
1. 创建一个空的栈和一个空的列表,用于存储操作符和操作数。
2. 从左到右遍历中缀表达式中的每个元素。
3. 如果当前元素是操作数,则将其添加到列表中。
4. 如果当前元素是操作符,则执行以下操作:
- 将栈中所有优先级大于或等于该操作符的操作符弹出栈,并添加到列表中。
- 将该操作符压入栈中。
5. 如果遇到左括号,将其压入栈中。
6. 如果遇到右括号,则执行以下操作:
- 弹出栈中的操作符,直到遇到左括号。
- 左括号不添加到列表中,右括号也不添加到列表中。
7. 遍历完中缀表达式后,将栈中的所有操作符依次弹出并添加到列表中。
8. 列表中的元素即为后缀表达式。
下面是一个示例代码实现:
```python
def infix_to_postfix(infix):
# 操作符的优先级
precedence = {
'+': 1,
'-': 1,
'*': 2,
'/': 2,
'^': 3
}
# 创建一个空的栈和一个空的列表
stack = []
postfix = []
# 遍历中缀表达式中的每个元素
for token in infix:
if token.isdigit():
# 如果是操作数,直接添加到列表中
postfix.append(token)
elif token in precedence:
# 如果是操作符,弹出栈中所有优先级大于或等于该操作符的操作符,并添加到列表中
while stack and stack[-1] != '(' and precedence.get(stack[-1], 0) >= precedence[token]:
postfix.append(stack.pop())
# 将该操作符压入栈中
stack.append(token)
elif token == '(':
# 如果是左括号,将其压入栈中
stack.append(token)
elif token == ')':
# 如果是右括号,依次弹出栈中的操作符,直到遇到左括号
while stack and stack[-1] != '(':
postfix.append(stack.pop())
# 弹出左括号
stack.pop()
# 遍历完中缀表达式后,将栈中的所有操作符依次弹出并添加到列表中
while stack:
postfix.append(stack.pop())
# 返回后缀表达式
return postfix
```
使用示例:
```python
infix = '3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3'
postfix = infix_to_postfix(infix.split())
print(postfix) # ['3', '4', '2', '*', '1', '5', '-', '2', '3', '^', '^', '/', '+']
```
注意:在将中缀表达式转换为后缀表达式时,需要将中缀表达式拆分为单个元素,例如上面的示例中,使用了 `infix.split()` 将中缀表达式拆分为一个个的单词。