简单计算器

简单计算器

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 147 Accepted Submission(s): 80
 
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
 
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
 
Output

            对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
 
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
 
Sample Output
3.00
13.36
 
 
Source
浙大计算机研究生复试上机考试-2006年
 
Recommend
JGShining
 
import java.math.BigDecimal;
import java.util.LinkedList;
import java.util.Scanner;

public class Main {
    /*
    题意:汉语题目就不多说了

    初步思路:简单的模拟,就是读取的时候有点麻烦,没事字符串截取,然后写一个转化函数马上就可以了

    #错误:打脸瞬间打脸......脑子怎么回事,运算符的优先级都忘了!!!

    #改进;用java搞,大数的问题解决了,然后将所有的东西存进链表,从头开始遍历,遇到运算符号,按照优先级将两侧的数进行
        整合,先算乘法,再算除法,在加减,但是现在的问题来了...写残了...
    #二次改进:懵了,看了题解才发现不用大数,数据这么不严谨,200位的话怎么搞。用栈来模拟优先级的运算

    #三次改进:实际情况第一次改进的想法错了,第二次改进没毛病,但是...用java交的时候要把包名去了.....
    */
    public static void main(String[] args) {
        // write your code here
        Scanner cin=new Scanner(System.in);
        while(cin.hasNext()){
            String str = cin.nextLine();// 接收输入的字符串
            if (str.compareTo("0") == 0) {// 若是只输入0,则结束
                break;
            }
            String[] strs = str.split(" ");// 根据题目要求,分割字符串
            //利用LinkedList来模拟队列的入队出队,从而实现简单的运算
            LinkedList<BigDecimal> s1 = new LinkedList<>();
            LinkedList<String> s2 = new LinkedList<>();
            s1.add(new BigDecimal(strs[0]));
            for (int i = 1; i < strs.length; i++) {
                // 如果出现“*”or“/”就把他相邻的两个数进行对应运算,并加入s1中
                if (strs[i].compareTo("*") == 0) {
                    i++;// 取“*”后一个数值
                    BigDecimal m = s1.getLast();
                    s1.pollLast();
                    BigDecimal res=new BigDecimal(strs[i]);
                    s1.add(m .multiply(res));
                    continue;
                }
                if (strs[i].compareTo("/") == 0) {
                    i++;
                    BigDecimal m = s1.getLast();
                    s1.pollLast();
                    BigDecimal res=new BigDecimal(strs[i]);
                    s1.add(m .divide(res,220,BigDecimal.ROUND_HALF_UP));
                    continue;
                }
                // 如果是“+”or“-”号就加入到s2中
                if ((strs[i].compareTo("+") == 0)
                        || (strs[i].compareTo("-") == 0)) {
                    s2.add(strs[i]);
                    continue;
                }
                s1.add(new BigDecimal(strs[i])); // 把所有没有运算的数值装进来

            }
            BigDecimal sum = s1.pollFirst();// 先取出队尾给sum
            //System.out.println(sum);
            //从模拟队列中取出符号和数值进行运算,直到为空
            while (!s1.isEmpty()) {
                BigDecimal e=s1.pollFirst();
                String symbol=s2.pollFirst();
                //System.out.print(symbol);
                //System.out.println();
                if(symbol.equals("+")){
                    BigDecimal tmp=sum.add(e);
                    sum=tmp;
                }else{
                    BigDecimal tmp=sum.subtract(e);
                    sum=tmp;
                }
            }
            System.out.printf("%.2f", sum);
            System.out.println();

        }
    }
}

 

posted @ 2017-02-03 23:55  勿忘初心0924  阅读(228)  评论(0编辑  收藏  举报