利用栈求表达式的值 能够完成加诚乘除及带括号的四则混合整数运算: 1运算符为加(“+”)、诚(“-”)、乘(“*”)、除(“/”): 2.运算数是整数,且位数不限(如:3、33、333): 3.括号(“(”和“)”),括号用于高优先级运算,一个运算可以被多重 括号所包围,如:“((1+2))*3〞是合法的: 1.当用户输入的表达式合法,则给出计算结果,如果表达式非法,则给出 错误提示。
时间: 2023-10-08 16:04:31 浏览: 91
可以使用栈来求表达式的值,具体步骤如下:
1. 创建一个操作数栈和一个运算符栈。
2. 依次读入表达式中的每个字符,如果是数字则压入操作数栈,如果是运算符则压入运算符栈。
3. 如果当前字符是“(”,则将其压入运算符栈。
4. 如果当前字符是“)”,则从运算符栈中弹出运算符和两个操作数,进行计算,并将计算结果压入操作数栈,直到弹出的运算符是“(”。
5. 如果当前字符是“+”、“-”、“*”或“/”,则比较当前运算符与运算符栈栈顶的运算符的优先级,如果当前运算符优先级低于或等于栈顶运算符,则弹出栈顶运算符和两个操作数,进行计算,并将计算结果压入操作数栈,重复该步骤,直到当前运算符优先级高于栈顶运算符或运算符栈为空,然后将当前运算符压入运算符栈。
6. 当读入完所有字符后,如果运算符栈不为空,则从运算符栈中弹出运算符和两个操作数,进行计算,并将计算结果压入操作数栈,重复该步骤,直到运算符栈为空。
7. 如果操作数栈中只有一个元素,则该元素即为表达式的值。
以下是使用 Python 实现的代码示例:
```python
def calculate(expression):
operators = []
operands = []
def priority(op):
if op in ('+', '-'):
return 1
elif op in ('*', '/'):
return 2
else:
return 0
for c in expression:
if c.isdigit():
operands.append(int(c))
elif c in ('+', '-', '*', '/'):
while operators and priority(c) <= priority(operators[-1]):
op = operators.pop()
b = operands.pop()
a = operands.pop()
if op == '+':
operands.append(a + b)
elif op == '-':
operands.append(a - b)
elif op == '*':
operands.append(a * b)
elif op == '/':
operands.append(a // b)
operators.append(c)
elif c == '(':
operators.append(c)
elif c == ')':
while operators[-1] != '(':
op = operators.pop()
b = operands.pop()
a = operands.pop()
if op == '+':
operands.append(a + b)
elif op == '-':
operands.append(a - b)
elif op == '*':
operands.append(a * b)
elif op == '/':
operands.append(a // b)
operators.pop()
while operators:
op = operators.pop()
b = operands.pop()
a = operands.pop()
if op == '+':
operands.append(a + b)
elif op == '-':
operands.append(a - b)
elif op == '*':
operands.append(a * b)
elif op == '/':
operands.append(a // b)
return operands[0]
```
调用示例:
```python
print(calculate('(1+2)*3')) # 输出 9
print(calculate('1+(2-3)*4/5')) # 输出 0
```
阅读全文