题解 | #四则运算#

四则运算

http://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s1 = in.next();
        StringBuilder s = new StringBuilder(s1);
        double result = 0;
        double a = 0;
        double b = 0;
        Stack<Character> st = new Stack<>();
        Stack<Double> it = new Stack<>();
        char c = ' ';
        char c1;
        char c2;
        char c5;
        char c6;
        int j = 0;
        String s2 = new String();
        outer:
        for(int i = 0; i<s.length(); i++){
            if(s.charAt(i) == '[' || s.charAt(i) == '{'){
                s.setCharAt(i,'(') ;
            }else if(s.charAt(i) == ']' || s.charAt(i) == '}'){
                s.setCharAt(i,')');
            }

            if(s.charAt(i)>='0' && s.charAt(i)<='9'){
                s2 = String.valueOf(s.charAt(i));
                while(i<j){
                    continue outer;
                }
                j = i + 1;
                while(j<s.length() && s.charAt(j)>='0' && s.charAt(j)<='9'){
                    s2 = s2 + s.charAt(j);
                    j++;
                }
                if(c != '-'){
                    it.push(Double.valueOf(s2.toString()));
                }else if(c == '-' && st.peek() == '-'){
                    it.push(Double.valueOf(s2.toString()));
                }else{
                    it.push((Double.valueOf(s2.toString())) * (-1));
                }
            }else if(s.charAt(i) == '('){
                st.push(s.charAt(i));
            }else if(s.charAt(i) == '/'){
                st.push(s.charAt(i));
            }else if(s.charAt(i) == '*'){
                if(!st.empty()){
                    while(st.peek() == '/'){
                        a = it.pop();
                        b = it.pop();
                        result = b / a;
                        it.push(result);
                    }
                }
                st.push(s.charAt(i));
            }else if(s.charAt(i) == '-' && c != '('){
                while(!st.empty() && (st.peek() == '*' || st.peek() == '/' || st.peek() == '-')){
                    a = it.pop();
                    b = it.pop();
                    c5 = st.pop();
                    c6 = st.empty()?' ':st.peek();
                    switch(c5){
                        case '*':
                            result = b * a;
                            it.push(result);
                            break;
                        case '/':
                            result = b / a;
                            it.push(result);
                            break;
                        case '-':
                            if(c6 == '-'){
                                a = -1 * a;
                            }
                            result = b - a;
                            it.push(result);
                            break;
                    }
                }
                st.push(s.charAt(i));
            }else if(s.charAt(i) == '+'){
                while(!st.empty() && (st.peek() == '*' || st.peek() == '/' || st.peek() == '-')){
                    a = it.pop();
                    b = it.pop();
                    c1 = st.pop();
                    c2 = st.empty()?' ':st.peek();
                    switch(c1){
                        case '*':
                            result = b * a;
                            it.push(result);
                            break;
                        case '/':
                            result = b / a;
                            it.push(result);
                            break;
                        case '-':
                            if(c2 == '-'){
                                a = a * (-1);
                            }
                            result = b - a;
                            it.push(result);
                            break;
                    }
                }
                st.push(s.charAt(i));
            }else if(s.charAt(i) == ')'){
                while(!st.empty() && st.peek() != '('){
                    a = it.pop();
                    b = it.pop();
                    switch(st.pop()){
                        case '*':
                            result = b * a;
                            it.push(result);
                            break;
                        case '/':
                            result = b / a;
                            it.push(result);
                        case '+':
                            result = b + a;
                            it.push(result);
                            break;
                        case '-':
                            result = b - a;
                            it.push(result);
                            break;
                    }
                }
                st.pop();
            }
            c = s.charAt(i);
        }
        char c3;
        char c4;
        while(!st.empty()){
            a = it.pop();
            b = it.pop();
            c3 = st.pop();
            c4 = st.empty()?' ':st.peek();
            switch(c3){
                case '*':
                    result = b * a;
                    it.push(result);
                    break;
                case '/':
                    result = b / a;
                    it.push(result);
                case '+':
                    result = b + a;
                    it.push(result);
                    break;
                case '-':
                    if(c4 == '-'){
                        a = a * (-1);
                    }
                    result = b - a;
                    it.push(result);
                    break;
            }
        }
        System.out.print((int)result);
    }
}
全部评论

相关推荐

尊嘟假嘟点击就送:加v细说,问题很大
点赞 评论 收藏
分享
已老实求offer😫:有点像徐坤(没有冒犯的意思哈)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务