JAVA_栈实现综合计算器

本文介绍了一种使用栈实现的四则运算计算器,通过解析表达式并利用两个栈分别存储数字和运算符,实现了对复杂数学表达式的计算。文章详细展示了代码逻辑,包括运算符优先级判断、数字和运算符的识别、以及最终结果的计算。

图例

在这里插入图片描述

代码

package com.Calculator;
import java.util.Stack;


public class Calculator {
    public static void main(String[] args) {
        String expression = "30+2*6-2";
        Stack<Integer> numStack = new Stack<>();
        Stack<Character> operStack = new Stack<>();
        Calculator cal = new Calculator();
        int index = 0 ,a=0,b=0;
        char oper ;
        String keepNum = "";
        while(true){
            char c = expression.charAt(index);
            if(cal.isOper(c)){     //如果是运算符
                if(!operStack.isEmpty()){
                    if(cal.priority(c)<=cal.priority(operStack.peek())){
                        a=numStack.pop();
                        b=numStack.pop();
                        oper=operStack.pop();
                        int res = cal.cal(a, b, oper);
                        numStack.push(res);
                        operStack.push(c);
                    }else{
                        operStack.push(c);
                    }
                }else{
                    operStack.push(c);
                }
            }else{
                //numStack.push(c-48);此只适用于个位数,如果是两位数就不行
                keepNum+=c;
                if(index == expression.length()-1 || cal.isOper(expression.charAt(index+1))){
                    numStack.push(Integer.parseInt(keepNum));
                    keepNum="";
                }
            }
            index++;
            if(index>=expression.length())
                break;
        }
        while(true){
            if(!operStack.isEmpty()){
                a=numStack.pop();
                b=numStack.pop();
                oper = operStack.pop();
                int res = cal.cal(a, b, oper);
                numStack.push(res);
            }else {
                break;
            }
        }
        System.out.println(numStack.peek());
    }
    
    //返回运算符的优先级
    public int priority(char oper){
        if(oper=='*'||oper=='/')
            return 1;
        else if(oper=='+'||oper=='-')
            return 0;
        else
            return -1;
    }
    //判断是否是运算符
    public boolean isOper(char oper){
        return oper=='+'||oper=='-'||oper=='*'||oper=='/';
    }

    //计算方法
    public int cal(int a,int b,char oper) {
        int res = 0;
        switch (oper) {
            case '+':
                res=a+b;
                break;
            case '-':
                res=b-a;//注意顺序!!!!!!!!!!!
                break;
            case '*':
                res=a*b;
                break;
            case '/':
                res=b/a;
                break;
            default:break;
        }
        return res;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值