题解 | #表达式求值#

表达式求值

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

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.next();
        s.replace('[', '(');
        s.replace(']', ')');
        s.replace('{', '(');
        s.replace('}', ')');
        System.out.println(solution(s));
    }

    public static int solution(String s) {
        Deque<Integer> stack = new LinkedList<>();
        char ops = '+';//记录运算符号
        int num = 0;//记录数字
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                while(i < s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    num = num * 10 + s.charAt(i) - '0';
                    i++;
                }
                i--;//for循环还会加1
                switch(ops) {
                    case '+' : 
                        stack.push(num);
                        break;
                    case '-':
                        stack.push(-num);
                        break;
                    case '*':
                        stack.push(stack.pop() * num);//乘法优先计算
                        break;
                    case '/':
                        stack.push(stack.pop() / num);//除法优先计算
                }
                num = 0;//计算完归零
            } else if (s.charAt(i) == '(') {
                int j = i + 1;
                int count = 1;
                while (j < s.length() && count != 0) {//遇到左括号加1,右括号抵消减1
                    if (s.charAt(j) == '(') count++;
                    if (s.charAt(j) == ')') count--;
                    j++;
                }
                num = solution(s.substring(i + 1, j - 1));
                i = j - 1;
                switch(ops) {
                    case '+' : 
                        stack.push(num);
                        break;
                    case '-':
                        stack.push(-num);
                        break;
                    case '*':
                        stack.push(stack.pop() * num);
                        break;
                    case '/':
                        stack.push(stack.pop() / num);
                }
                num = 0; 
            } else if (s.charAt(i) == '+' || s.charAt(i) == '-' || s.charAt(i) == '*' || s.charAt(i) =='/') {
                ops = s.charAt(i);
            }        
        }
        int res = 0;
        while (!stack.isEmpty()) {
            res += stack.pop();
        }
        return res;
    }
}

全部评论

相关推荐

02-10 21:39
Java
点赞 评论 收藏
分享
明天不下雨了:兄弟你是我今天看到的最好看的简历(我说的是简历风格跟简历书写)把985 211再搞亮一点。投boss就说;您好,我华科(985)研二在读,本科211。对您的岗位很感兴趣,希望能获得一次投递机会。
点赞 评论 收藏
分享
sagima:然后这个帖子又登上了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务