用python写无优先级运算问题
时间: 2023-09-29 16:06:51 浏览: 51
可以使用逆波兰表达式来解决无优先级运算问题。逆波兰表达式是一种将运算符放在操作数之后的表达式,可以通过栈来计算。
具体实现可以按照以下步骤:
1. 定义一个栈来存储操作数和运算符。
2. 将中缀表达式转换成逆波兰表达式,具体方法可以使用栈来实现:
- 如果遇到操作数,直接输出。
- 如果遇到左括号,将其入栈。
- 如果遇到右括号,将栈中的元素全部弹出,直到遇到左括号。
- 如果遇到运算符,将其与栈顶的运算符比较,如果栈顶的运算符优先级高于等于当前的运算符,则将栈顶的运算符弹出,直到栈顶的运算符优先级低于当前的运算符,然后将当前的运算符入栈。
3. 对逆波兰表达式进行计算,具体方法可以使用栈来实现:
- 如果遇到操作数,将其入栈。
- 如果遇到运算符,将栈顶的两个元素弹出,进行运算,然后将结果入栈。
4. 最终栈中只剩下一个元素,即为表达式的结果。
下面是一个简单的实现示例:
```python
def to_postfix(expr):
precedence = {'+': 1, '-': 1, '*': 2, '/': 2}
postfix = []
stack = []
for token in expr:
if token.isdigit():
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 precedence[token] <= precedence.get(stack[-1], 0):
postfix.append(stack.pop())
stack.append(token)
while stack:
postfix.append(stack.pop())
return postfix
def evaluate_postfix(postfix):
stack = []
for token in postfix:
if token.isdigit():
stack.append(int(token))
else:
b = stack.pop()
a = stack.pop()
if token == '+':
stack.append(a + b)
elif token == '-':
stack.append(a - b)
elif token == '*':
stack.append(a * b)
elif token == '/':
stack.append(a // b)
return stack[0]
expr = input('请输入表达式:')
postfix = to_postfix(expr)
result = evaluate_postfix(postfix)
print('结果为:', result)
```
示例输入:
```
请输入表达式:3+4*5/(1-5)
```
示例输出:
```
结果为: 5
```