题解 | #表达式求值#

表达式求值

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



public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    public int solve (String s) {
        // write code here
        if(s == null || s.length() == 0){
            return 0;
        }
        char[] data = s.toCharArray();
        int n = data.length;
        //默认是 + 号 第一个数字作为 + a
        char sign = '+';
        //可能连续两个都是数字,只有遇到符号才重置
         int number = 0;
        Stack<Integer> stack = new Stack<>();
        for(int i = 0;i< data.length;i++){
           
            char item = data[i];
            if(item == ' '){
                continue;
            }
            if(item >= '0' && item <= '9'){
                number = number  * 10 +item - '0';
            }
            
            if(item == '('){
                int brackets = 1;
                int j = i+1;
                while(brackets >0){
                    if(data[j] == '('){
                        brackets ++;
                    }else if(data[j] == ')'){
                        brackets --;
                    }
                    j++;
                }
                //while条件终止时 j多加了1
                //扩号里的 数 就是 i+1 到 j - 1 
                number = solve(s.substring(i+1,j-1));
                //扩号里的求解完了 从 ) 后开始 让 i++循环
                i = j - 1;
            }
            
            if( item < '0' || item >'9' || i == n - 1){
                
                if(sign == '+'){
                    stack.push(number);
                }else if(sign == '-'){
                    stack.push( -1 *number);
                }else if(sign == '/'){
                    stack.push(stack.pop()/number);
                }else if(sign == '*'){
                    stack.push(stack.pop() * number);
                }
                // 下个数字或者表达式前的符号
                sign = item;
                number = 0 ;
            }
            
        }
        int ans = 0;
        while(!stack.isEmpty()){
            ans += stack.pop();
        }
        return ans;
    }
}
全部评论

相关推荐

三年之期已到我的offer快到碗里来:9硕都比不上9本
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务