题解 | #表达式求值#

表达式求值

http://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

//栈中存入数字,最后将栈中的数字相加即得最后结果

//方法1
//先默认为“+”
//看表达式接下来是数字(0-9),运算符(+-*/),优先级("()")
//1、若是运算符,则存入运算符
//2、若是数字,则存入数字,然后用运算符处理数字,如下:此时数字是完整的
//         “+”:直接入栈
//         “-”:num = -num; 入栈
//         “*”:num = 栈顶元素 * num; 入栈
//         “/”:num = 栈顶元素 / num; 入栈
//3、若是优先级,找到“(”对应的“)”,然后递归计算括号里的值,得到num,然后按照2的方法处理num
//         "(":当再次遇到“(”,计数器+1,当遇到“)”,计数器-1,
//             直到计数器值为0,即找到匹配的“)”


//方法2
//先默认为“+”
//看表达式接下来是数字(0-9),运算符(+-*/),优先级("()")
//1、若是数字,则记住此时的数num,先不入栈(此时数字不一定完整)
//2、若是运算符,如下:先看上一次的运算符
//         “+”:直接入栈
//         “-”:num = -num; 入栈
//         “*”:num = 栈顶元素 * num; 入栈
//         “/”:num = 栈顶元素 / num; 入栈
//         存入这次的运算符
//         临时变量 num == 0;
//3、若是优先级,找到“(”对应的“)”,然后递归计算括号里的值,得到num,此时num是完整的,
//         "(":当再次遇到“(”,计数器+1,当遇到“)”,计数器-1,
//             直到计数器值为0,即找到匹配的“)”
import java.util.*;
//采用方法2
public class Main {
       public static void main(String[] args){
           Scanner in = new Scanner (System.in);
           String s = in.nextLine();
           s = s.replace("[","(");
           s = s.replace("{","(");
           s = s.replace("]",")");
           s = s.replace("}",")");
           Main j =new Main();
           System.out.println(j.solve(s));
       } //main
    public int solve(String s){
        int len = s.length();
        if(s == null || len == 0){ return 0;}
        Stack<Integer> st = new Stack<>();
        char ops = '+';
        int num =0;
        for(int i =0; i<len; i++){
            char c = s.charAt(i);
            if( c == ' ' ){ continue; }
            if( Character.isDigit(c) ){
                num = num*10 + ( c-'0' );
            }
            if( c =='(' ){
                int j = i+1;//移到小括号后一位
                int count = 1;//括号数
                while(count>0){
                    if(s.charAt(j)==')' ){count--;}
                    if(s.charAt(j)=='(' ){count++;}
                    j++;
                }//while_count
                num = solve( s.substring(i+1,j-1) );//括号里的算完
                i = j-1;//因为下次循环时,i先+1
            }//if_优先级
            if(!Character.isDigit(c) && c!='(' || i == len-1 ){
                //如果是最后一位,是数字也需要进行这一步
                if( ops == '+' ){ st.push(num); }
                else if( ops == '-' ){ st.push(-1*num); }
                else if( ops == '*' ){ st.push(st.pop()*num); }
                else if( ops == '/' ){ st.push(st.pop()/num); }
                ops = c;
                num = 0;
            }//运算符
        }//for_i
        int ans = 0;
        while(!st.isEmpty()){
            ans += st.pop();
        }
        return ans;
    }//solve
}//Mian
全部评论

相关推荐

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