美文网首页ACM
nyoj 35 表达式求值

nyoj 35 表达式求值

作者: 百炼 | 来源:发表于2016-11-23 12:49 被阅读0次

    [TOC]
    题目:表达式求值

    1.png

    思路:

    Stack<String> ops存操作
    Stack<Double> vals存操作数

    1. 碰到操作数,如果ops.peek()是否为"*","/",如果是则计算一次;
    2. 碰到"+","-",如果ops.peek()是否为"+","-",如果是则计算一次;
    3. 碰到"(","*","/"直接入符号栈;
    4. 碰到")"计算到"("为止,如果"("出栈后栈顶为"*","/"则驱除两个,计算一次;

    测试数据说明:

    1. "*","/" 应该是从前往后计算,而不是从后往前计算
    (1+2)*5.156/54*4.154/47852*41463=
    ((1+2)*5.156/54+4.154)/47852*41463-56*78/32*0.154=
    
    1. "*","/" 应该是从前往后计算,而不是从后往前计算
    1-5+3-2=
    
    1. 碰到")",计算直到"(",此时当判断"("前是不是为"*","/"若是,则计算一次
    5*(1-5*8)-1=
    

    代码

    import java.util.Scanner;
    import java.util.Stack;
    
    public class Main {
        public static void main(String[] args) {
            Stack<String> ops = new Stack<String>();
            Stack<Double> vals = new Stack<Double>();
            Scanner sc = new Scanner(System.in);
            int T;
            T = sc.nextInt();
            while (true) {
                if (T == 0) break;
                T--;
                String str = sc.next();
                str = str.replace("(", " ( ").replace(")", " ) ").replace("+", " + ").replace("-", " - ").replace("*", " * ").replace("/", " / ").replace("="," = ");
                String[] ss = str.split(" ");
                for (String s : ss) {
                    //System.out.println(s);
                    //处理
                    if(s.equals(""));
                    else if(s.equals("=")){
                        while(!ops.isEmpty()){
                            double val=vals.pop();
                            String op=ops.pop();
                            if(op.equals("+")) val=val+vals.pop();
                            else val=vals.pop()-val;
                            vals.push(val);
                        }
                    }
                    else if (s.equals("(") || s.equals("*")||s.equals("/")) ops.push(s);
                    else if(s.equals("+")||s.equals("-")){
                        if(!ops.isEmpty()&&(ops.peek().equals("+")||ops.peek().equals("-"))){
                            double val=vals.pop();
                            String op=ops.pop();
                            if(op.equals("+")) val=val+vals.pop();
                            else if(op.equals("-")) val=vals.pop()-val;
                            vals.push(val);
                        }
                        ops.push(s);
                    }
                    else if (s.equals(")")){
                        while(!ops.isEmpty()&&!ops.peek().equals("(")){
                            double val=vals.pop();
                            String op=ops.pop();
                            if(op.equals("+")) val=val+vals.pop();
                            else if(op.equals("-")) val=vals.pop()-val;
                            vals.push(val);
                        }
                        if(!ops.isEmpty()) ops.pop();
                        //作* /的运算
                        if(!ops.isEmpty()&&(ops.peek().equals("*")||ops.peek().equals("/"))){
                            double val=vals.pop();
                            String op=ops.pop();
                            if(op.equals("*")) val=val*vals.pop();
                            else val=vals.pop()/val;
                            vals.push(val);
                        }
                    }else{
                        //碰到数字的时候做* / 运算一次,不做+ - 运算
                        double val=Double.parseDouble(s);
                        if(!ops.isEmpty()&&(ops.peek().equals("*")||ops.peek().equals("/"))){
                            String op=ops.pop();
                            if(op.equals("*")) val=val*vals.pop();
                            else val=vals.pop()/val;
                        }
                        vals.push(val);
                    }
                }
                System.out.printf("%.2f\n",vals.pop());
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:nyoj 35 表达式求值

        本文链接:https://www.haomeiwen.com/subject/ygfvpttx.html