一.需求:使用栈完成计算表达式的结果,输入为String类型,计算包括加减乘除,如“7*2*2-5+1-5+3-4”,输出为结果。
二.实现方法:
- 创建两个栈,一个为数栈(numStack),一个为符号栈(operStack),分别保存数字和运算符。
- 使用index作为索引遍历表达式。
- 数字直接入数栈。
- 符号分情况讨论:
- 若符号栈为空,则直接入栈。
- 若符号栈有操作符,则进行比较。若当前操作符优先级小于等于栈中操作符,则从数栈中pop出两个数字,从符号栈中pop出一个符号,进行运算,结果存入数栈,然后将当前操作符入符号栈。若当前操作符优先级大于栈中操作符,则直接入符号栈。
- 整个表达式扫描完毕后,顺序从数栈和符号栈中pop数和符号,并进行运算,最后在数栈中的数字就是表达式的结果。
三.图像表示
数字直接入栈
符号在栈为空时直接入栈
栈不为空时判断优先级
优先级高于栈中操作符 优先级低于栈中操作符
扫描完成后,顺序执行12-2,3+10
四.细节:
- 符号入栈的过程相当于对操作符进行排序,将优先级较高的操作符先进行计算,扫描完之后栈中越接近栈顶,优先级越高。
- 扫描完成后从栈顶开始进行二元运算,符合运算优先级规则。