栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

用数组栈来实现个位数计算器---java版

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用数组栈来实现个位数计算器---java版

目录

项目思路:

项目用到的图片/gitee地址

项目代码:

判断优先级的方法:

判断优先级

进行计算,并返回结果

main方法中的代码

项目思路:

1.通过index来遍历输入的表达式,将数字和+-*/分开

2.如果用index发现的是数字则直接进入数栈numStack

3.如果index扫描到一个符号,就分为如下情况:

3.1如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或等于栈中的操作符,就需要将numStack中pop出两个数字,并将符号栈弹出一个符号进行计算,并将结果放到数栈numStack中,并重新判断该操作符是否小于或等于栈顶的操作符,即可以将index-1就可以了,然后用index接着遍历字符串。

3.2如果符号栈中无操作符,就将操作符入符号栈。

4.如果表达式扫描完毕,就顺序的从数栈弹出pop两个数字,符号栈弹出一个符号,进行运算。

5.最后的结果在numStack中,并且只有一个数字。将栈顶弹出。


项目用到的图片/gitee地址

个位数计算器https://gitee.com/ALi_L/javaDataStructurs.git


项目代码:

判断优先级的方法:

注解:注释可以更好的解决减法的问题

 //判断优先级的
    public static int priority(int oper){
        if(oper == '*' || oper == '/'){
            return 3;
        }
        //此处是为了将-与+的优先级分开
// else if (oper == '-'){
//            return 2;
//        }
 else {
            return 1;
        }
    }


判断优先级

注解:这个较简单

//判断是否为运算符
    public static boolean isOper(char val){
        boolean res = (val == '*' || val == '/' || val == '+' || val == '-');
        return res;
    }

进行计算,并返回结果

注:注意减法与除法,是后一个数减去前一个数

//进行计算并返回计算结果
    public static int cal(int num1,int num2,int oper){
        int res = 0;
        switch (oper){
            case '*':
                res = num1 * num2;
                break;
            case '/':
                res = num2 / num1;
            break;
            case '+':
                res = num1 + num2;
            break;
            case '-':
                res = num2 - num1;
            break;
            default:
                break;

        }
        return res;
    }


main方法中的代码

注:这个是项目的核心。39行代码可以解决减法存在的bug

public static void main(String[] args){
        String str = "1-1*1+9";

        int res = 0;
        int num1 = 0;
        int num2 = 0;
        int oper = 0;
        char ch = ' ';//扫描用的
        int index = 0;

        ArrayStack numberStack = new ArrayStack(10);
        ArrayStack operStack = new ArrayStack(10);

        while (true){
            ch = str.charAt(index);
            if(isOper(ch)){
                //是操作符的时候执行下面的代码
                if(operStack.isEmpty()){
                    //符号栈为空直接进栈
                    operStack.push(ch);
                }else {
                    //如果当前的运算符比栈顶的运算符优先级低,则进行计算,并将结果放在numberStact中
                    //否则直接进栈
                    if (priority(ch) <= priority(operStack.peek())) {
                        num1 = numberStack.pop();
                        num2 = numberStack.pop();
                        oper = operStack.pop();
                        res = cal(num1, num2, oper);
                        numberStack.push(res);
                        //计算后将运算符放入符号栈operStack
                        // operStack.push(ch);
                        //上面的两行是直接将符号入栈了,存在bug:如计算:1-1*1+9

                        //此处不应该将运算符直接放进符号栈,需要再次进行判断,上面的if判断条件必须有=号,
                        // 否则就将-的优先级比+高才可以
                        index--;
                    } else {
                        operStack.push(ch);
                    }
                }
            }
            //是数字的时候
            else {
                numberStack.push(ch-48);
            }
            index++;
            if(index >= str.length()){
                break;
            }


        }

        //全部入栈后,计算最后的结果
        while (true){
            if(operStack.isEmpty()){
                break;
            }
            num1 = numberStack.pop();
            num2 = numberStack.pop();
            oper = (char)operStack.pop();
            res = cal(num1,num2,oper);
            numberStack.push(res);

        }

        //取出栈顶的元素,并且不弹出栈
        System.out.println(numberStack.peek());



    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/425564.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号