中缀转后缀与直接计算:两种算术表达式求值方法

5星 · 超过95%的资源 需积分: 9 11 下载量 69 浏览量 更新于2024-11-28 收藏 152KB DOC 举报
"本文将介绍如何使用两种方法实现表达式自动计算,分别是通过中缀表达式转后缀表达式然后再求值,以及直接对中缀表达式求值。这两种方法都涉及到栈和数组的运用,以及对运算符优先级的理解。实验报告中包含了详细的过程描述、流程图和运行结果截图,帮助理解实现过程。" ### 一、中缀表达式转后缀表达式求值 中缀表达式是人们日常写作中常用的表达式形式,例如 `2 + 3 * 4`,而后缀表达式,也称为逆波兰表示法,如 `2 3 4 * +`,更适合计算机处理。转换过程如下: 1. **设立运算符栈**:栈用于存储运算符,初始为空。 2. **扫描中缀表达式**:从左到右逐字符读取,遇到操作数时输出并添加#作为分隔符;遇到运算符,与栈顶运算符比较优先级。 - 如果运算符优先级高于栈顶运算符,将运算符压入栈。 - 如果运算符优先级低于或等于栈顶运算符,将栈顶运算符弹出并输出,直到找到优先级更低的运算符或者栈为空。 - 遇到左括号,压入栈;遇到右括号,连续弹出栈顶元素直到遇到左括号。 3. **处理输入字符串末尾**:当整个表达式读取完毕,将栈内所有剩余运算符弹出并添加到结果字符串,得到后缀表达式。 ### 二、后缀表达式求值 后缀表达式求值过程相对简单,因为它遵循“后进先出”的原则,使得运算顺序清晰: 1. **设置运算栈**:开始时栈为空。 2. **扫描后缀表达式**:从左到右读取,遇到操作数时压入栈;遇到运算符时,弹出栈顶的两个操作数,将它们与运算符组合进行运算,结果再压入栈。 3. **结束条件**:当表达式扫描完毕,栈中只剩下一个元素,即为计算结果。 ### 三、直接对中缀表达式求值 直接对中缀表达式求值需要处理运算符的优先级和左右括号的影响: 1. **双栈策略**:设置操作数栈(浮点数栈)和运算符栈,分别存储操作数和运算符。 2. **读入表达式元素**:遇到操作数压入操作数栈,遇到运算符则根据优先级决定是否压入运算符栈。 - 当运算符优先级大于或等于栈顶运算符,且当前运算已完成,才将运算符压入栈。 - 左括号直接压入运算符栈,右括号出现时,连续弹出运算符栈顶元素直到遇到左括号,完成一次子表达式的计算。 3. **结束处理**:表达式读取完毕后,运算符栈中的运算符依次处理,直到栈空,得到最终结果。 通过这两种方法,可以实现对各种算术表达式的自动计算,不仅适用于简单的四则运算,也能处理复杂表达式。在实际应用中,这些方法通常被封装成解析器或解释器,用于各种编程语言和计算器软件中。
2010-03-09 上传
用两种方式实现表达式自动计算 对栈的应用 (1)中缀表达式转后缀表达式并计算(扫两遍) 创建一个数组存储输入的计算表达式。另创建一个数组储存将要生成的后缀表达式。创建一个栈储存操作符。 对已存储的表达式数组扫描。 判断当前节点,如果是操作数或’.’,直接加入后缀表达式中,如果是操作符,则比较前一个操作符与当前操作符的优先级。如果前一个操作符的优先级较高,则将前一个操作符加入后缀表达式中,否则将操作符压入操作符栈。 如果遇到左括号’(’,直接入栈;如果遇到右括号’)’,则在操作符栈中反向搜索,直到遇到匹配的左括号为止,将中间的操作符依次加到后缀表达式中。 当执行完以上操作,发现栈中仍有剩余操作符,则将操作符依次加到后缀表达式中。此时中缀表达式已经转换成了后缀表达式。 对后缀表达式进行计算。 如果后缀表达式为大于0小于9的字符,则将它转换成浮点型数据并存入数栈中。如果遇到操作符,则从数栈中提取两个数,进行相应的运算。依次进行下去,当没有运算符是,运算结束得到最后的结果。 (2)表达式求值(扫一遍) 创建一个数组存储输入的计算表达式。创建两个栈,一个字符型的栈,一个双精度型的栈。分别用来存储字符和数。 对已存储的表达式数组扫描。 判断当前节点,如果是操作数和’.’,将字符型的操作数转换为浮点型的数后存入操作数栈。 如果是操作符则判断操作符的优先级。如果字符栈中已存储符号的优先级小于要存入的字符的优先级,则直接让字符入操作符栈。如果字符栈中已存储符号的优先级大于或等于要存入的字符的优先级,则取出操作符栈中的一个字符和操作数栈中的两个数进行计算,然后将结果存入操作数栈中,同上进行下去,直到字符栈中已存储符号的优先级小于要存入的字符的优先级时,将操作符存入操作符栈中。 当遇到左括号’(’,将左括号直接存入操作符栈中。当遇到右括号’)’,则在操作符栈中反向搜索,并且每搜到一个字符就在操作数栈中取两个数进行相应的计算。然后,将运算结果存入到操作符栈中。如此进行下去,直到遇到左括号结束。将左括号从栈中取出。最后,如果操作符栈中还有符号,就从操作符栈顶开始将操作符取出并从操作数栈顶开始取出两个数字进行计算,将结果存入操作数栈中。重复上述操作直到操作符栈中没有操作符,得到运算结果。