计算器输入的字串属于中缀表达式,即Infix Expression,例如:2+3*5-6。
然而对于程序来说,要处理这样的表达式比较困难,因为不知道该何时处理表达式中的某个子表达式。因此,需要将这样的表达式转换成后缀表达式(Suffix Expression),然后通过程序逻辑将程序结果计算出来。
下面看其一个转换的例子(取自维基百科):
按照算法逻辑,我们可以将2+3*5-6转换成235*+6-。
在我们处理计算器的表达式时,要考虑其是由数字符号和计算符号组成,然而计算符号又存在一定的优先级。因此,可以维护两个栈分别存储数字符号num_stack和计算符号operator_stack,通过不断的入栈和出栈的操作实现表达式的计算。
下面考虑到实现的是一个简易的计算器,仅考虑输入正数和“+、-、*、/”四个运算。不过为了之后的扩展,也考虑"(、)"两个运算符。
其中,将中缀表达式转后缀表达式的并计算出结果的伪代码如下:
输入:中缀表达式s
输出:计算结果result
算法calculateInfixExp(s):
start 遍历s中所有的字符c,
如果c = ‘(’,则 str = str +c until c = ‘)’;
calResult = calculateInfixExp(str);
num_stack.push(calResult);
如果c为数字符号,则num_stack.push(c);
如果c为计算符号,c的优先级小于或等于栈顶计算符号,则
start 遍历operator_stack,
计算符号 = operator_stack.pop();
n1 = num_stack.pop();
n2 = num_stack.pop();
num_stac