1*2+3*4, 这个对应的中缀表达式就是[1,*,2,+,3,*,4], 需要转换成后缀表达式[1,2,*,3,4,*,+], 才能进一步计算得到结果.
1.得到后缀表达式
需要准备两个容器, 符号栈 operatorStack 与 盛放后缀表达式的队列 expQueue.
按照下列规则从前到后遍历中缀表达式.
- 遇到数字num, 就expQueue.push(num);
- 若遇到操作符, 分两步处理
2.1 在符号栈operatorStack 中弹出若干个操作符op, 直至遇到优先级更低的操作符, 做expQueue.push(op)操作.
2.2 将当前运算符op放入栈中, operatorStack.push(op)
2.计算后缀表达式
需要用到上面得到的后缀表达式expQueue, 还需要一个保存计算结果的数字栈 numStack.
按照下列规则从前到后遍历后缀表达式.
- 遇到数字num, numStack.push(num);
- 若遇到操作符op, 从numStack取出栈尾两个数字,
b=numStack.pop(),a=numStack.pop()
得到 c=a op b , numStack.push(c).
不断进行上述操作, 最后只剩一个数字, 就是答案.
3. 例题
见: 四则运算-jobdu-1101 .