题解 | #表达式求值#

表达式求值

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

//核心思想:符号全部消化掉,全都转换成数字存入栈中,最后将栈中数字累加得到表达式计算结果;
//碰到括号,把括号中的子字符串递归处理,因此方法中真正处理的是 +-*/ 和 数字 的字符
import java.util.*;
public class Solution {
    //1、数字  2、运算符  3、括号(遇到括号就先计算括号内的子字符的结果)
    public int solve(String s) {
        s.trim();
        s.replaceAll(" ","");
        Deque<Integer> stack = new ArrayDeque<>();
        int number = 0;
        char sign = '+';
        char[] cs = s.toCharArray();
        for(int i = 0; i<cs.length;i++){
            char c = cs[i];
            if(Character.isDigit(c)){
                number = number*10+(c-'0');
            }

            if(c=='('){
                int countKuoHao = 1;
                int j = i+1;
                while(countKuoHao !=0){
                    if(cs[j] == '('){
                        countKuoHao++;
                    }
                    if(cs[j] == ')'){
                        countKuoHao--;
                    }
                    j++;
                }
                number = solve(s.substring(i+1,j-1));
                i = j-1;
            }
             if(!Character.isDigit(c) || i == cs.length-1){
                 if(sign == '+') stack.push(number);
                 if(sign == '-') stack.push(-1*number);
                 if(sign == '*') stack.push(stack.pop()*number);
                 if(sign == '/') stack.push(stack.pop()/number);
                 number  = 0;
                 sign = c;
             }
        }
        int ans = 0;
        while(!stack.isEmpty()){
            ans+=stack.pop();
        }
        return ans;
    }
}

全部评论

相关推荐

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