给定一个中缀表达式,请编写程序计算该表达式的值。表达式包含+、-、*、\、(、),所有运算均为二元运算,操作数均为正整数,但可能不止一位,不超过5位。运算结果为整数,值域为[−2 31 ,2 31 )。除法运算结果若为小数则进行截尾取整。若除法运算中除数为0,则输出illegal。
时间: 2023-04-28 09:05:28 浏览: 246
这里是一个可以计算中缀表达式的简单程序,使用栈来完成表达式的计算过程。程序中使用了两个栈,一个存储操作符,一个存储操作数。
代码如下:
```python
def calc(expression):
# 定义一个操作符优先级的字典
priority = {'(': 0, '+': 1, '-': 1, '*': 2, '/': 2}
# 定义两个栈,一个存储操作符,一个存储操作数
operator_stack = []
operand_stack = []
# 定义一个函数用于计算两个操作数的结果
def operate(num2, num1, operator):
if operator == '+':
return num1 + num2
elif operator == '-':
return num1 - num2
elif operator == '*':
return num1 * num2
elif operator == '/':
if num2 == 0:
print('illegal')
exit()
else:
return int(num1 / num2)
for char in expression:
if char.isdigit():
# 如果是数字,则将其转换为整数并加入操作数栈中
operand_stack.append(int(char))
elif char in priority:
# 如果是操作符,则比较其与栈顶操作符的优先级
while operator_stack and priority[char] <= priority[operator_stack[-1]]:
# 取出栈顶操作符和栈顶两个操作数,进行计算并将结果压入操作数栈中
operator = operator_stack.pop()
num2 = operand_stack.pop()
num1 = operand_stack.pop()
operand_stack.append(operate(num2, num1, operator))
# 将当前操作符压入操作符栈中
operator_stack.append(char)
elif char == '(':
# 如果是左括号,则直接压入操作符栈中
operator_stack.append(char)
elif char == ')':
# 如果是右括号,则取出栈顶操作符和栈顶两个操作数,进行计算并将结果压入操作数栈中,直到遇到左括号
while operator_stack[-1] != '(':
operator = operator_stack.pop()
num2 = operand_stack.pop()
num1 = operand_stack.pop()
operand_stack.append(operate(num2, num1, operator))
operator_stack.pop()
# 当表达式扫描完毕后,如果操作符栈中还有操作符,则依次取出栈顶操作符和栈顶两个操作数,进行计算并将结果压入操作数栈中
while operator_stack:
operator = operator_stack.pop()
num2 = operand_stack.pop()
num1 = operand_stack.pop()
operand_stack.append(operate(num2, num1, operator))
# 最终操作数栈中只剩下一个元素,即为表达式的计算结果
return operand_stack[0]
```
注意,该程序假设输入的表达式是合法的,没有对表达式的合法性进行检查,如果输入的表达式是不合法的,程序可能会出现错误。
阅读全文