为四则运算式“6+(8-2)*2÷3”转逆波兰表达“682-2*3÷+”设计算法,编程实现。
分析:在数学运算表达式中,运算符总是置于与之相关的两个运算对象之间,在计算结果时,要考虑括号、运算符号的优先性。为了程序实现的方便,波兰逻辑学家J.Lukasiewicz提出了另一种表示法,将运算符置于其运算对象之后,没有括号,不用考虑运算符号的优先性。这种表达式称为后缀表达式,又叫逆波兰表达式。
如表达式“682-2*3÷+”是四则运算式“6+(8-2)*2÷3”的逆波兰表达式。为了处理方便,规定表达式中的数均为小于10的正整数,运算符为+、-、*、÷。
(1)抽象建模
设计两个栈bds、fh,栈bds用来存放表达式,栈fh用来暂时存放运算符。从左往右扫描四则运算式,遇到数字时,入栈bds;遇到运算符号时,根据运算符号的优先级设计进栈与出栈。
四则运算式“6+(8-2)*2÷3”转换规则的模拟过程如表所示:

结合表格的操作过程,用栈bds和栈fh记录每个操作后的栈内情况(见图),那么在操作2中栈fh里有内容为 +(-+(-(请从栈底到栈顶顺序书写)。

(2)设计算法
基于问题的抽象与建模,解决该问题的主要算法描述如下:
从左往右遍历四则运算式s(设中间变量为ch):
1)当ch是数字,直接入栈bds;
2)当ch是运算符:
a.若ch为左括号时,直接入栈fh;
b.若ch为右括号时,则将栈fh元素弹出,压入栈bds,直到遇到左括号(左括号只
弹出,不压入栈bds);
c.若ch为其它运算符时,如果运算符ch优先级大于栈fh中栈顶元素的优先级(或栈fh为空),直接入栈fh;否则,将栈fh元素依次弹出,并压入栈bds,直到运算符ch优先级大于栈fh中栈顶元素的优先级(或栈fh为空);
3)将栈bds中元素依次出栈,即为该四则运算s的后缀表达式。
(3)编写程序
实现上述功能的Python代码如下,请在横线处填入合适代码。

【考点】栈的应用.
【答案】+(-
【解答】
【点评】
声明:本试题解析著作权属菁优网所有,未经书面同意,不得复制发布。
发布:2024/11/29 21:0:1组卷:19引用:2难度:0.3