表达式解析-后缀表达式

引言

         前一段时间,因为需要在产品内部的脚本解析程序中引入表达式解析功能,研究了一下表达式解析的常用方法.

         表达式解析是程序设计语言中最基本的功能之一,我们日常使用的一般为中缀表达式,然而中缀表达式的解析比较复杂,在计算机中的解析一般是将中缀表达式转化为后缀表达式(又叫逆波兰表达式),然后进行解析.

 

概念

         中缀表达式:通用的算术以及逻辑公式表示方式,其表达式中操作符位于操作数中间.中缀表达式不易被计算机解析,但其符合人们的日常使用.

         后缀表达式:不包含括号,操作符位于两个操作数后面,所有的计算依据操作符的出现顺序,严格按照从左到右的顺序进行,不考虑操作符的优先级别.

 

解析

         表达式的解析过程一般分为以下几步.

1.       扫描表达式,获得表达式中的每一个独立的词素(Token).

2.       转化扫描后的中缀表达式为后缀表达式.

3.       计算后缀表达式.

 

         中缀表达式计算一般采用算符优先法”, 其必须严格按照以下规则进行计算:

1.       先计算括号.

2.       先计算优先级高的操作符

3.       从左到右进行计算.

为实现解析,需要两个栈,一个用于保存操作符,一个用于保存操作数以及结果,当读到操作符时并不能立即作计算,需要与操作符栈顶元素进行优先级比较,根据结果然后采用不同的处理方式, 而且算法较后缀表达式不管是时间复杂度或者是空间复杂度都要高.

后缀表达式由于其自身的优点,表达式的解析是按照操作符的出现顺序进行的,比较简单,扫描一遍即可完成解析.但需要将中缀表达式转化为后缀表达式.

 

表达式转化

         对于简单的中缀表达式可以很容易的获得后缀表达式,但对于复杂的中缀表达式,可以通过二叉树来表示表达式,然后对其进行前序,中序或者后序遍历即可获得想要的表达式.这种方式很方便表达式转化.在此介绍一种简单的转化算法.

可以通过栈来处理,基本思路如下:

1.       从左到右读取中缀表达式,依次一个操作项.

2.       如果是操作数直接进入输出队列.

3.       读到左括号时总是将它压入栈中.

4.       读到右括号, 将最近栈顶的第一个左括号上面的操作符全部依次弹出, 送至输出队列后, 再丢弃左括号.

5.       当读到操作符时,将栈中所有优先级高于或等于当前操作符的操作符弹出,送到输出队列中.

6.       中缀表达式全部读完后,若栈中仍然有运算符,将其送到输出队列中./

 

举例

         中缀表达式:   3 * (1 + 4)

         后缀表达式:   1 4 + 3 *

 

 

展开阅读全文

没有更多推荐了,返回首页