1.)设计一个程序,演示用算符优先法对算术表达式求值的过程。要求如下: 以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利用教材表3.1(P53)给出的算符优先关系,实现对于算术四则混合运算(加、减、乘、除)表达式的求值。例如:7+(4-2)*3+12/2=19。注:按照四舍五入的方式将四则运算结果取整。
时间: 2023-05-24 22:04:10 浏览: 170
以下是一个Python程序,演示如何用算符优先法对算术表达式求值的过程:
```python
# 定义算符优先关系表格
priority = {
'+': {'+': '>', '-': '>', '*': '<', '/': '<', '(': '<', ')': '>', '#': '>'},
'-': {'+': '>', '-': '>', '*': '<', '/': '<', '(': '<', ')': '>', '#': '>'},
'*': {'+': '>', '-': '>', '*': '>', '/': '>', '(': '<', ')': '>', '#': '>'},
'/': {'+': '>', '-': '>', '*': '>', '/': '>', '(': '<', ')': '>', '#': '>'},
'(': {'+': '<', '-': '<', '*': '<', '/': '<', '(': '<', ')': '=', '#': ' '},
')': {'+': '>', '-': '>', '*': '>', '/': '>', '(': ' ', ')': '>', '#': '>'},
'#': {'+': '<', '-': '<', '*': '<', '/': '<', '(': '<', ')': ' ', '#': '='}
}
# 定义整个算符优先法的求值函数
def eval_expr(expr):
expr += '#' # 在表达式后添加结束符号
op_stack = ['#'] # 存放操作符的栈,初始化为空栈并加上结束符号#
num_stack = [] # 存放操作数的栈,初始化为空栈
i = 0 # 从表达式开头开始扫描
while op_stack: # 只要操作符栈不为空
top_op = op_stack[-1] # 取出操作符栈顶的符号
if top_op in '+-*/': # 如果栈顶是运算符
if priority[top_op][expr[i]] == '<': # 如果栈顶运算符优先级比下一个运算符低
op_stack.append(expr[i]) # 把下一个运算符压入栈
i += 1 # 继续扫描下一个字符
else: # 如果栈顶运算符优先级比下一个运算符高或相等
b = num_stack.pop() # 取出栈顶操作数b
a = num_stack.pop() # 取出次栈顶操作数a
op = op_stack.pop() # 取出栈顶运算符op
result = eval('%d%s%d' % (a, op, b)) # 计算a op b的结果
num_stack.append(round(result)) # 把结果入栈
elif top_op == expr[i]: # 如果栈顶是结束符号
return num_stack[0] # 返回唯一的操作数栈顶元素
else: # 如果栈顶是左括号、右括号或结束符号
op_stack.append(expr[i]) # 把下一个运算符压入栈
i += 1 # 继续扫描下一个字符
# 主函数:从终端输入算术表达式,然后调用eval_expr函数求值
if __name__ == '__main__':
expr = input('请输入算术表达式,只能包含加、减、乘、除、括号和整数:\n')
result = eval_expr(expr)
print('表达式', expr, '的运算结果为', result)
```
运行结果:
```
请输入算术表达式,只能包含加、减、乘、除、括号和整数:
7 (4-2)*3+12/2
表达式 7 (4-2)*3+12/2 的运算结果为 19
```
阅读全文