题解 | #表达式求值#

表达式求值

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

算法思路如下:
从左往右依次遍历判断每个遇到的字符,如果是数字,则记录更新当前的数字,如果是运算符,则根据上一次的运算符将计算后的结果存入栈中,如果是左括号则代表遇到了子问题,递归调用函数,如果是右括号,break掉,进行栈内结果的计算。

代码如下:`

class Solution {
    private int index = 0;
    public int calculate(String s) {
        char[] ch = s.toCharArray();
        return cal(ch);
    }
    private int cal(char[] ch){
        Deque<Integer> stack = new ArrayDeque<>();
        int num = 0;
        char sign = '+';
        for(; index < ch.length; index++){
            char c = ch[index];
            if(Character.isDigit(c)){
                num = num*10 + (c-'0');
            }
            if(c == '('){
                index++;//index指针指到下一个字符
                num = cal(ch);
            }
            //当遇到了新的运算符,就要对上一个运算符sign和累计的数字num作运算
            //空格直接无视,i继续前进
            //遇到字符串末尾,肯定是要结算的
            if(!Character.isDigit(c)&& c != ' ' || index == ch.length-1){
                int pre = 0;
                switch(sign){

                    case '+': 
                        stack.push(num);
                        break;
                    case '-': 
                        stack.push(-num);
                        break;
                    case '*':
                        pre = stack.pop();
                        stack.push(pre * num);
                        break;
                    case '/':
                        pre = stack.pop();
                        stack.push(pre / num);
                        break;
                }
                sign = c;
                num = 0;//计数归位
            }
            if(c == ')') break;//阶段,后面开始计算局部结果,返回
        }

        int res = 0;
        while(!stack.isEmpty()){
            res += stack.pop();
        }
        return res;
    }
}
全部评论

相关推荐

hso_:哈哈哈哈哈哈我没offer一样在同一道题开喷了
投递深圳同为数码等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务