我们在日常生活中一般使用的是中缀表达式,即a*b的形式,其特点是操作符位于中间位置,中缀表达式虽然方便阅读理解,但是无法判断优先级,只能按顺序一个一个算下去,这样是不利于程序进行计算的,所以计算器算法的原理是将中缀表达式转换为后缀表达式,然后进行计算。后缀表达式的特点是操作符位于后面位置,如a b *。
计算器的实现需要借助两个栈结构,一个是数字栈,一个是符号栈。首先数字按顺序进栈,当读到运算符时,弹出两个数字进行运算,再把结果进栈。当读到一个数的时候,立即把他放到输入中。符号不立即输出,而是放入栈中。当遇见右括号时,我们就把栈的元素弹出,直到遇见一个左括号。如果遇见其他符号(“+ - * / ”),我们就从栈中弹出元素直到发现优先级更低的元素。
我们的要求是,优先级高的要先进行运算,后缀表达式是只有在遇到运算符时才弹出两个数进行运算,那么我们要做的就是把优先级最高的最先弹出,在有加减乘除和括号的运算中,括号的优先级无疑是最高的,所以遇到右括号时就可以直接弹出直到遇到左括号,遇到其他符号时就先存放在栈中,然后,当一个优先级低的元素要进栈时,优先级较高的运算符就必须先弹出来进行运算。至于优先级相同的,则遵循先后原则,栈里面的元素先出现,就弹出先进行运算。到最后栈中还剩下的运算符,由于后面没有运算符了,而栈中的运算符本来就是按照优先顺序排序的,所以就直接按顺序弹出。