题解 | #表达式求值#代码容易懂,但是比较繁琐,写出不易

表达式求值

https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4


    public int solve (String s) {
        // write code here
        Stack<Integer> nums=new Stack<>();
        nums.push(0);
        Stack<Character> ops=new Stack<>();
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if(c=='('){
                ops.push(c);
            }else if(c==')'){
                while(ops.peek()!='('){
                    nums.push(calculate(ops.pop(),nums.pop(),nums.pop()));
                }
                ops.pop();
            }else if(c=='*'||c=='+'||c=='-'){
                while(!ops.isEmpty()&&precedence(c)<=precedence(ops.peek())){
                    nums.push(calculate(ops.pop(),nums.pop(),nums.pop()));
                }
                ops.push(c);
            }else{
                int num=0;
                while(i<s.length()&&Character.isDigit(s.charAt(i))){
                    num=num*10+s.charAt(i)-'0';
                    i++;
                }
                i--;
                nums.push(num);
            }
        }
        while(!ops.isEmpty()){
            nums.push(calculate(ops.pop(),nums.pop(),nums.pop()));
        }
        return nums.pop();
    }
    private int calculate(char op,int b, int a){
        switch(op){
            case '+':return a+b;
            case '-':return a-b;
            case '*': return a*b;
            default:return 0;
        }
    }
    private int precedence(char op){//字符的优先级
        if(op=='*') return 2;
        if(op=='+'||op=='-') return 1;
        return 0;
    }

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务