【每日一题Java】双栈计算器

题目简述:

合理输入一串算式,如“3.5+2*2.5-5”,输出计算结果,精确到小数点后两位。

代码示例:

import java.util.*;
import java.util.stream.Collectors;

public class Main {
    private static Deque<Character> opr=new LinkedList<>();
    private static Deque<Double> number=new LinkedList<>();
    public static void main(String[] args) {
        Scanner scaner=new Scanner(System.in);
        String formual=scaner.nextLine();
        char[] str=formual.toCharArray();
        int i=0;
        while(i<str.length){
            char c=str[i];
            if(isOpr(c)){//是符号位
                Character peek=opr.peek();//前一个符号
                while(peek!=null&&isHigherPro(peek,c)){
                    //是符号位并且符号位优先级更高
                    cal();
                    peek=opr.peek();
                }
                opr.push(c);
                i++;
            }
            else{//是数字位
                double num=0;//小数点前
                double num2=0;//小数点后
                int times=1;
                boolean flag=false;//小数点不存在
                while(i<str.length&&!isOpr(str[i])){
                    //数字位可能有多位,所以在循环中判断是否为符号位
                    if(str[i]=='.'){
                        flag=true;//小数点存在
                    }
                    else{
                        if(flag){
                            double val=str[i]-'0';
                            for(int j=0;j<times;j++){
                                val/=10.0;
                            }
                            num2+=val;
                            times++;
                        }
                        else{
                            num=num*10+(str[i]-'0');
                        }
                    }
                    i++;
                }
                number.push(num+num2);
            }
        }
        while(!opr.isEmpty()) cal();
        System.out.println(String.format("%.2f",number.peek()));
    }
    private static  boolean isOpr(char c){//判断是否为符号位
        return c=='+'||c=='-'||c=='*'||c=='/';
    }
    private static  boolean isHigherPro(char peek,char c){
        //判断是入栈的符号与在栈的符号优先级高低
        return ((peek=='*'||peek=='/')||(c=='+'||c=='-'));
    }
    private static void cal(){
        double a=number.pop();
        double b=number.pop();
        char c=opr.pop();
        switch(c){
            case '+':
                number.push(b+a);//b先入栈,后出栈
                break;
            case '-':
                number.push(b-a);
                break;
            case '*':
                number.push(b*a);
                break;
            case '/':
                number.push(b/a);
                break;
        }
    }
}

输出结果示例:

3.5+2*2.5-5
3.50

参考链接:

1、https://www.bilibili.com/video/BV1Gv411T7pi?p=76&spm_id_from=pageDriver

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

林月明

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

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

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

打赏作者

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

抵扣说明:

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

余额充值