输入一个含有四则运算带小括号的表达式,利用栈和运算符优先级,编程计算该表达式的值。
时间: 2024-01-03 11:04:35 浏览: 329
可以使用中缀表达式转后缀表达式的算法,再用后缀表达式计算结果。
具体步骤如下:
1. 定义一个栈来存储运算符和操作数。
2. 遍历中缀表达式,遇到数字就直接输出,遇到运算符就判断优先级,如果优先级大于栈顶运算符则直接入栈,否则弹出栈中运算符直到栈顶运算符优先级小于当前运算符,然后将当前运算符入栈。遇到左括号直接入栈,遇到右括号则弹出栈中运算符直到遇到左括号为止,并将左括号弹出。
3. 遍历完中缀表达式后,将栈中剩余的运算符全部弹出。
4. 将得到的后缀表达式进行计算,遇到数字直接入栈,遇到运算符弹出栈中两个操作数进行计算后再将结果入栈,最后栈中的结果即为表达式的值。
下面是使用 Python 实现的代码:
```python
class Stack:
def __init__(self):
self.items = []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[-1]
def is_empty(self):
return len(self.items) == 0
def infix_to_postfix(expression):
precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '(': 0}
operators = Stack()
postfix = []
tokens = expression.split()
for token in tokens:
if token.isdigit():
postfix.append(token)
elif token in '+-*/':
while not operators.is_empty() and precedence[operators.peek()] >= precedence[token]:
postfix.append(operators.pop())
operators.push(token)
elif token == '(':
operators.push(token)
elif token == ')':
while operators.peek() != '(':
postfix.append(operators.pop())
operators.pop()
while not operators.is_empty():
postfix.append(operators.pop())
return postfix
def evaluate_postfix(postfix):
operands = Stack()
for token in postfix:
if token.isdigit():
operands.push(int(token))
else:
operand2 = operands.pop()
operand1 = operands.pop()
if token == '+':
result = operand1 + operand2
elif token == '-':
result = operand1 - operand2
elif token == '*':
result = operand1 * operand2
elif token == '/':
result = operand1 / operand2
operands.push(result)
return operands.pop()
if __name__ == '__main__':
expression = input('请输入带小括号的四则运算表达式:')
postfix = infix_to_postfix(expression)
result = evaluate_postfix(postfix)
print('表达式的值为:', result)
```
示例输入和输出:
```
请输入带小括号的四则运算表达式:( 1 + 2 ) * 3 - 4 / 2
表达式的值为: 7
```
阅读全文