算式表达式

来源:互联网 发布:淘宝云客服登录网址 编辑:程序博客网 时间:2024/06/05 22:59

输入一个由数字、+,-,*,/ 组成的算术表达式,求其值
输入:正整数
输出:保留两位小数
example:
1+3*6-4/2
17
1+2*2*2-4*2/2*2+1
2

 import java.util.Scanner;public class formulaExpress { public static void main(String[] args){//表达式java实现//终于能AC,数不清调试了多少回        Scanner sc= new Scanner(System.in);        int count=0;        int length=0;        String s=sc.nextLine();//只讨论正数情况        String[] a=s.split("\\p{Punct}");     String []b=new String[a.length-1];//长度为操作数减一        //String[] b=s.split("\\p{Alnum}");//有空字符串//空字符串删除,前移        //String  c=b[0];//不知道截取的是什么,不过可以用c保存下来//b0与b2居然不一样//只能换思路了        for(int i=0;i<a.length-1;i++){            length+=a[i].length();            b[i]=s.substring(length+i,length+i+1);//试了三遍终于出来了啊啊啊,借助a[i]长度        }        //改进:连乘问题(i--),连乘除,放在一起,保持同级关系//        for(int i=0;i<b.length;i++) {            //截取的字符串与手动表示的不一样,醉了//保存吧,可能是“+”特殊,spilt需转义            if("*".equals(b[i])||"/".equals(b[i])) {                if ("*".equals(b[i])) {//等于号不匹配,我绝招都寄出来了,忧伤                    double product = Double.parseDouble(a[i]) * (Double.parseDouble(a[i + 1]));                    a[i] = String.valueOf(product);                    for (int j = i; j < b.length; j++) {                        if (j + 2 < a.length) {                            a[j + 1] = a[j + 2];                            b[j] = b[j + 1];                        } else {                            a[a.length - 1] = "0";//让本该删掉尾数无法匹配                            b[b.length - 1] = "#";                        }                    }                    count++;                    i--;//解决连乘                    // return;//退出当前循环语句                }               else if ("/".equals(b[i])) {                    double product = Double.parseDouble(a[i]) / (Double.parseDouble(a[i + 1]));                    a[i] = String.valueOf(product);                    for (int j = i; j < b.length; j++) {                        if (j + 2 < a.length) {                            a[j + 1] = a[j + 2];                            b[j] = b[j + 1];                        } else {                            a[a.length - 1] = "0";//让本该删掉尾数无法匹配                            b[b.length - 1] = "#";                        }                    }                    count++;                    i--;                }            }        }        for(int i=0;i<b.length-count;i++){//加减法采取从左往右的算法,碰到一个就计算一个//加减法不需要移动,乘除法或有优先级的才移            // 在外面有优先级的//类比上面也可以放在一个for(同级运算符)            if("-".equals(b[i])||"+".equals(b[i])) {                if("+".equals(b[i])){                    double product = Double.parseDouble(a[0]) + (Double.parseDouble(a[i + 1]) );                    a[0]=String.valueOf(product);//运算结果存在a[0]里                             //不需要移动,因而不需要计数器                }                else if ("-".equals(b[i])){                    double product = Double.parseDouble(a[0]) - (Double.parseDouble(a[i + 1]) );                    a[0]=String.valueOf(product);                }            }        }     //     // if(count==b.length)//存在加减法就<         System.out.printf("%.2f",Double.parseDouble(a[0])); }}

以前数据结构没学好,现在终于明白了,细节挺多,就是一开始没仔细想,后来调试到快懵逼的程度,才AC,也怪样例太容易通过,哼
这是用java实现的,并没有用栈,下次讨论更复杂的情况会用到并发下博客的,希望我的做法能对有疑惑的小伙伴提供帮助

原创粉丝点击