这个例子是书上P52页栈应用举例的其中一个算法
算法的简单描述
为了实现这个算法,我们需要两个栈,一个是符号栈OPTR,另一个是数据栈OPND,算符预先设定好优先级,当解析到数字的时候,将其入数据栈
当解析到运算符的时候,比较它和之前一个运算符的优先级,如果比之前的优先级高的话,先入栈,如果和之前的元素优先级一样的话,就可以将括号去掉了(因为这个时候已经算完了),如果比之前的优先级低的话,那么就需要将两个运算数据出栈,运算符也出栈,进行运算,然后将运算结果入栈,并且保留这个运算符继续进行比较。
这里有一个小细节需要注意,就是,先出栈的是第二个运算数,后出栈的是第一个运算数,如果没有注意到的话做减法的时候符号是相反的。
如果符号栈OPTR的栈底元素是#,并且当前元素也是#的话,表示解析结束
算符优先级表如下所示
代码实现
我是用查表的方式来检查两个算符的优先级关系的
用1表示theta1>theta2;用-1表示theta1<theta2;用2表示语法错误