“携手创作,共同成长!开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情”
案例:使用栈来实现综合计算机功能
示例执行过程:
eg:3+2*6-2
首先index开始遍历第一个数字3
判断是数字,就将3加入数字栈
再开始index遍历第二个符号+
判断是符号,就将+加入符号栈
再开始index遍历第三个数字2
判断是数字,就将2加入数字栈
再开始index遍历第四个符号*
判断是符号并且优先级大于栈中的操作符,就将直接入符号栈
再开始index遍历第五个数字6
判断是数字,就将6加入数字栈
再开始index遍历第六个符号-
判断是符号并且优先级小于栈中的操作符,就将数栈中pop出两个数6和2,再在从符号栈中pop出一个运算符*,进行运算6*2,将得到的结果12入数栈,然后将当前的操作符-入符号栈
再开始index遍历第七个数字2
判断是数字,就将2加入数字栈
此时扫描已经完毕,开始顺序的从栈中取出数栈和符号栈中pop出相应的数(2和12)和符号(-),并进行运算(12-2=10),再把10放入栈
再pop出相应的数(10和3)和符号(+),运算(3+10=10)得出结果13并将其入栈
此时栈中还有一个,那么该值就是最终结果
问题分析:上个代码只能支持个位数的加减乘除,如何能进行多位加减乘除?
问题点其实出现在:
若是数则会入栈,因为字符本身有ASCII码,所以要减去本身的值
numstack.push(ch-48);
这段代码其实只注意了1个字符而没有注意到30这个由两个字符组合的数
解决思路:1.所以当我们在处理多位数字时,不能只把他当成简单的一个字符来处理,还要进行处理
2.所以在处理数时,需要向expression的表达式的index再向后看一位,如果是数就进行扫描,如果是符号就入栈
3.因此我们需要定义一个字符串变量,用于数字的拼接
String keep="";//用于进行拼接多位数组
代码实现:
// numstack.push(ch-48); //只能处理单位数组
//开始处理多位数字
keep+=ch;
//判断下一个字符是不是数组,如果是数字,就继续扫描,如果是运算符,就直接入栈
//若是最后一位就直接入栈
if(index==experssion.length()-1){
numstack.push(Integer.parseInt(keep));
} else {
if (operstack.isOper(experssion.substring(index + 1, index + 2).charAt(0))) {
numstack.push(Integer.parseInt(keep)); //一定要将keep转成数字才可以
//重要的过程!!! 因为每一次都要初始化这个keep,不然好几位叠起来就上万了
keep = "";
}
}
}