计算器实现算数表达式求值
时间: 2023-09-14 18:11:26 浏览: 49
算数表达式求值可以使用栈来实现。具体的步骤如下:
1. 定义一个操作数栈和一个操作符栈。
2. 从左到右遍历表达式,如果当前字符是数字,将其压入操作数栈。
3. 如果当前字符是操作符,分以下情况处理:
1. 如果操作符栈为空或者栈顶操作符为左括号,将当前操作符压入操作符栈。
2. 如果当前操作符优先级高于栈顶操作符,将当前操作符压入操作符栈。
3. 如果当前操作符优先级低于或等于栈顶操作符,将栈顶操作符弹出,将操作数栈中的两个数弹出进行计算,并将结果压入操作数栈。重复此过程直到当前操作符可以压入操作符栈。
4. 如果当前操作符是右括号,将操作符栈中的操作符弹出,进行计算,直到遇到左括号为止,并将左括号弹出。
4. 表达式遍历完毕后,如果操作符栈不为空,按照上述方式弹出操作符进行计算,直到操作符栈为空。
5. 操作数栈中剩下的唯一一个数就是表达式的值。
下面是一个示例代码实现:
```python
class Calculator:
def __init__(self):
self.op_stack = []
self.num_stack = []
def calculate(self, expression):
for c in expression:
if c.isdigit():
self.num_stack.append(int(c))
elif c in ['+', '-', '*', '/']:
while self.op_stack and self.op_stack[-1] != '(' and self._compare(c, self.op_stack[-1]) <= 0:
self._calculate()
self.op_stack.append(c)
elif c == '(':
self.op_stack.append(c)
elif c == ')':
while self.op_stack[-1] != '(':
self._calculate()
self.op_stack.pop()
while self.op_stack:
self._calculate()
return self.num_stack[-1]
def _calculate(self):
op = self.op_stack.pop()
num2 = self.num_stack.pop()
num1 = self.num_stack.pop()
if op == '+':
self.num_stack.append(num1 + num2)
elif op == '-':
self.num_stack.append(num1 - num2)
elif op == '*':
self.num_stack.append(num1 * num2)
elif op == '/':
self.num_stack.append(num1 / num2)
def _compare(self, op1, op2):
if op1 in ['+', '-'] and op2 in ['*', '/']:
return -1
if op1 in ['*', '/'] and op2 in ['+', '-']:
return 1
return 0
```
使用示例:
```python
calculator = Calculator()
result = calculator.calculate("3+2*4-(1+2)*3")
print(result) # 输出 1
```