1、要求演示在求值过程中运算符栈、操作数栈、输入字符和主要操作过程及运算结果。要求在算法用到栈和队列。要求设计的数据结构与算法使算法的时间复杂度与空间复杂度尽可能低。1.2 中缀表达式到后缀表达式的转换(1)问题分析 假设在算术表达式中只含四种基本运算符,操作数是10以内的整数。假设一个中缀表达式中没有括号(如4+2*3,它的后缀表达式为423*+)。在扫描到中缀表达式中的2后,能立即输出+,因为*具有较高优先级,必须先运算,因此需先保存+。也就是说,新扫描运算符优先级必须与前一个运算符的优先级做比较,如果新的运算符优先级高,就要像前一个运算符那样保存它,直到扫描到第二个操作数,将它输出后才能将该
2、运算符输出。因此,在转化中必须保存两个运算符,后保存的运算符先输出。用计算机来实现这个转化过程,就需要用到能后进先出的数据结构-栈。如果在中缀表达式中含小括号,那么由于括号隔离了优先级规则,它在整个表达式的内部产生了完全独立的子表达式。因此,前面的算法就需要有所改变。当扫描到一个左括号时,需要将其压入栈中,使其在栈中产生一个“伪栈底”。这样算法就可以像前面一样进行。但当扫描到一个右括号时,需要将栈中从栈顶到“伪栈底”之间的所有运算符弹出,然后再将这个“伪栈底”删除。(2) 数据结构与算法设计算法基本思想:利用栈(运算符栈)将中缀表达式转换为后缀表达式。顺序扫描中缀表达式,当读到数字时,直接将其
3、送至输出队列中;当读到运算符时,将栈中所有优先级高于或等于该运算符的运算符弹出,送至输出队列中,再将当前运算符入栈;当读入左括号时,将其入运算符栈;当读到右括号时,将栈中从栈顶到靠近栈顶的第一个左括号(“伪栈底”)之间的所有运算符全部依次弹出,送至输出队列中,再删除栈中的左括号。算法设计要求:将表达式中的操作数规定为1位数字字符。也可根据个人的能力对这部分功能进行扩充,使得操作数可以是多位数,甚至可以是小数或负数。运算符可只包含+、-、*、/ 四种基本运算。也可根据需要对算法的功能进行扩充,允许有其它运算符。为了简化算法,可认为扫描到的任何运算符,其优先级都比栈顶的左括号优先级高。为了方便边界
4、条件(栈空)判断,提高算法运行效率,在扫描中缀表达式之前,在空栈中预先压入一个#字符作为栈底元素,另外,在中缀表达式的最后增加一个#字符作为中缀表达式的结束标志,当扫描到结束符#时,将栈中从栈顶到#之间的所有运算符全部依次弹出,送至输出队列中,再删除栈中的#,并结束算法。算法应该能够过滤掉输入符号之间的空格。也可对本算法功能进行扩充,使其具有对对输入表达式进行语法检查的功能。要求输出中间结果及最终结果,最好能在算法运行过程中演示运算符栈和存放后缀表达式的队列的变化情况。如,若输入的中缀表达式字符串:1+2*(3-1+2)-3#,就会得到后缀表达式:1231-2+*+3-,在算法运行过程中,运算
5、符栈和存放后缀表达式的队列变化过程如表1-1所示。 表1-1 中缀表达式到后缀表达式的转换过程示例转换步骤中缀表达式的读入运算符栈后缀表达式初始 1+2*(3-1+2)-3# # 空1 +2*(3-1+2)-3# 12 2*(3-1+2)-3# #+3 *(3-1+2)-3# #+ 124 (3-1+2)-3# #+*5 3-1+2)-3# #+*(6 -1+2)-3# 1237 1+2)-3# #+*(-8 +2)-3# 12319 2)-3 # #+*(+ 1231-10 )-3 # 1231-211 -3 # 1231-2+12 3 # #- 1231-2+*+13 1231-2+*+3
6、14 1231-2+*+3-1.3 后缀表达式的计算 在后缀表达式中,不仅不需要括号,而且还完全免除了运算符优先规则。后缀表达式只需要从左到右顺序计算。后缀表达式中可能有多个运算符,如1231-2+*+3-,因此必须像输入字符一样保存中间结果。在计算后缀表达式时,最后保存的值最先取出参与运算,所以需要用栈来存储操作数及中间结果。因为在生成的后缀表达式队列中,存放的是字符序列,因此在算法中要有一个数字字符到数值的转换。(2)算法设计利用栈(操作数和运算结果栈)计算后缀表达式。顺序扫描后缀表达式,当读到数字时,将其送至栈中;当读到运算符时,将栈顶字符弹出,将其转换成对应的数值并赋给变量y,再将次栈
7、顶字符弹出,将其转换成对应的数值,并赋给变量x,之后计算xy,将运算结果转换成对应的数字字符送入栈中。注意,本算法主要涉及两种数据结构:队列和栈。本算法可以对任意输入的后缀表达式进行计算,也可以以前一个中缀表达式到后缀表达式转换算法的输出为输入,计算该后缀表达式。要求显示算法的运行结果。最好能在算法运行过程中演示运算结果栈的变化情况。以输入的后缀表达式为1231-2+*+3-的情况为例,在算法运行过程中,操作数及运算结果栈变化过程如表1-2所示。表1-2 后缀表达式计算过程示例计算步骤后缀表达式的读入 231-2+*+3- 31-2+*+3- 1-2+*+3- -2+*+3- 2+*+3- 1
8、22 +*+3- 1222 *+3- 124 +3- 18 3- 9 - 93 61.4 中缀表达式的计算要把一个表达式翻译成正确求值的机器指令序列,首先要能够正确解释表达式。要对算术表达式求值,首先要了解算术四则运算规则。即:先乘除,后加减;同级从左到右计算;先括号内,后括号外。例如,1+2*(3-1+2)-3=1+2*(2+2)-3=1+2*4-3=1+8-3=9-3=6任何一个表达式都是由操作数、运算符、界限符组成的。操作数既可以是常数,也可以是说明为变量或常量的标示符;运算符可以分为算术运算符、关系运算符和逻辑运算符3类;基本界限符有左右括号和表达式结束符等。 为了简化问题,运算符可只
9、包含+、-、*、/ 四种基本运算,括号只有圆括号。可根据需要及个人能力对算法的功能进行扩充,允许有其它运算符。算符之间的优先关系如表1-3所示。表1-3 算符之间的优先关系表+-*/()#26)。接收方只要按5位分割进行译码就可得到对应的字符。一般来说字符集中的字符在电文中出现的频率是不均匀的,例如,英文中使用A和E较Z要频繁的多。因此,若让使用频率高的字符编码尽可能短,则可使传送的电文总长缩短。然而使用不等长编码可能使译码产生多义性的电文,例如,若用00表示A,01表示E,0001表示Z,则当接受方接收到串0001时,无法确定原文是AE还是W。产生该问题的原因是A的编码是Z的编码的前缀。因此,若对某个字符集进行不等长编码,则要求字符集中任何一个字符的编码都不是其它字符编码的前缀,这种编码叫前缀(编)码。假设组成电文的字
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1