【JAVA】使用栈实现四则优先级计算器

栈四则优先计算器

原理

 * 四则优先计算器思路: @0xdF
 * 对符号栈进行出栈操作,如果出栈的符号为低优先级的+、-,则使用peek方法获取符号栈下一个符号,
 * 如果下一个符号为优先级高的 *、/ 则从数字栈取出三个数字,将后面两个数字通过高优先的计算后再入栈,最后再将当前低优先级的符号入栈即可。

代码

import java.util.Stack;

/***
 * 四则优先计算器思路: @0xdF
 * 对符号栈进行出栈操作,如果出栈的符号为低优先级的+、-,则使用peek方法获取符号栈下一个符号,
 * 如果下一个符号为优先级高的 *、/ 则从数字栈取出三个数字,将后面两个数字通过高优先的计算后再入栈,最后再将当前低优先级的符号入栈即可。
 */
public class calc {
    public static void main(String[] args) {
        Stack<String> stkNum = new Stack<>();
        Stack<String> stkOp = new Stack<>();
        String compute = "3*4+4/2-2*2+12/2+2";
        saveStack(compute,stkNum,stkOp);
        printStack(stkNum,stkOp);
        compute(stkNum,stkOp);
    }


    private static void printStack(Stack<String>... stacks){
        for(Stack<String> stack:stacks){
            for(String s:stack){
                System.out.print(s+",");
            }
        }
        System.out.println();

    }

    //将输入的结果入栈
    private static void saveStack(String compute,Stack<String> stkNum,Stack<String> stkOp){
        String num = "";
        for(int i =0;i<=compute.length()-1;i++){
            switch (compute.charAt(i)){
                case '+':
                    stkNum.push(num);
                    stkOp.push("+");
                    num = "";
                    break;
                case '-':
                    stkNum.push(num);
                    stkOp.push("-");
                    num = "";
                    break;
                case '*':
                    stkNum.push(num);
                    stkOp.push("*");
                    num = "";
                    break;
                case '/':
                    stkNum.push(num);
                    stkOp.push("/");
                    num = "";
                    break;
                default:
                    num+=compute.charAt(i);
                    break;
            }
        }
        stkNum.push(num); //最后一个数字组合后没有被提交
    }

    private static void compute(Stack<String> stkNum,Stack<String> stkOp){
        String res ="0",scRes="1",flag="0";
        if(stkNum.size()==stkOp.size()+1){
            Integer num0,num1,num2;
            String nextOP = "";
            //开始计算
            while (!stkOp.isEmpty()){
                String op = stkOp.pop();
                switch (op){
                    case "+":
                        if(!stkOp.isEmpty()){
                            nextOP = stkOp.peek();
                            if(nextOP.equals("/")||nextOP.equals("*")){
                                stkOp.pop(); //将本次计算的符号出栈
                                stkOp.push("+"); //加号暂时不计算,重新入栈
                                //表示下个符号为优先的符号
                                num0 = Integer.valueOf(stkNum.pop()); //这是被加数,后面要放回栈里
                                num1 = Integer.valueOf(stkNum.pop());
                                num2 = Integer.valueOf(stkNum.pop());
                                if(nextOP.equals("*")){
                                    stkNum.push(String.valueOf(num1*num2));
                                }else {
                                    stkNum.push(String.valueOf(num2/num1));
                                }
                                stkNum.push(String.valueOf(num0));
                            }else{
                                if(nextOP.equals("-")){
                                    num1 = Integer.valueOf(stkNum.pop());
                                    num2 = Integer.valueOf(stkNum.pop());
                                    stkNum.push(String.valueOf(num2-num1)); //将本次相加的结果入栈
                                }else{
                                    num1 = Integer.valueOf(stkNum.pop());
                                    num2 = Integer.valueOf(stkNum.pop());
                                    stkNum.push(String.valueOf(num1+num2)); //将本次相加的结果入栈
                                }

                            }
                        }else{
                            num1 = Integer.valueOf(stkNum.pop());
                            num2 = Integer.valueOf(stkNum.pop());
                            stkNum.push(String.valueOf(num1+num2)); //将本次相加的结果入栈
                        }
                        break;
                    case "-":
                        if(!stkOp.isEmpty()){
                            nextOP = stkOp.peek();
                            if(nextOP.equals("/")||nextOP.equals("*")){
                                stkOp.pop(); //将本次计算的符号出栈
                                stkOp.push("-"); //加号暂时不计算,重新入栈
                                //表示下个符号为优先的符号
                                num0 = Integer.valueOf(stkNum.pop()); //这是被减数,后面要放回栈里
                                num1 = Integer.valueOf(stkNum.pop());
                                num2 = Integer.valueOf(stkNum.pop());
                                if(nextOP.equals("*")){
                                    stkNum.push(String.valueOf(num1*num2));
                                }else {
                                    stkNum.push(String.valueOf(num2/num1));
                                }
                                stkNum.push(String.valueOf(num0));
                            }else{
                                num1 = Integer.valueOf(stkNum.pop());
                                num2 = Integer.valueOf(stkNum.pop());
                                stkNum.push(String.valueOf(num2-num1)); //将本次相减的结果入栈
                            }
                        }else{
                            if(nextOP.equals("-")){
                                num1 = Integer.valueOf(stkNum.pop());
                                num2 = Integer.valueOf(stkNum.pop());
                                stkNum.push(String.valueOf(num2-num1)); //将本次相加的结果入栈
                            }else{
                                num1 = Integer.valueOf(stkNum.pop());
                                num2 = Integer.valueOf(stkNum.pop());
                                stkNum.push(String.valueOf(num1+num2)); //将本次相加的结果入栈
                            }
                        }
                        break;
                    case "*":
                            num1 = Integer.valueOf(stkNum.pop());
                            num2 = Integer.valueOf(stkNum.pop());
                            scRes = String.valueOf((num1*num2));
                            stkNum.push(scRes);
                        break;
                    case "/":
                            num1 = Integer.valueOf(stkNum.pop());
                            num2 = Integer.valueOf(stkNum.pop());
                            scRes = String.valueOf((num2/num1));
                            stkNum.push(scRes);
                        break;
                }
            }
            System.out.println(stkNum.pop());
        }else {
            System.out.println("数据校验错误!");
        }
    }
}

结果

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0xdF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值