栈练习(2)

74 阅读3分钟

“携手创作,共同成长!开启掘金成长之旅!这是我参与「掘金日新计划 · 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 = "";  
        }  
    }  
}