题解 | #牛牛计算器#

牛牛计算器

https://www.nowcoder.com/practice/192ac31d5e054abcaa10b72d9b01cace

定义函数function做运算操作,处理'-'比较麻烦,我的做法是二元和一元身份分开,一元加入操作数栈计算时提取。

主函数中,分不同情况处理不同字符,注意循环计算到无可计算为止,尤其是面对右括号。

小坑null不能和字符比较。

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return int整型
     */

    void function (Deque<String> que1, Deque<Character> que2) {
        int a, b;
        if (que2.peekLast() != null) {
            char c = que2.pollLast();
            switch (c) {
                case '+':
                    b = Integer.parseInt(que1.pollLast());
                    if (que1.peekLast() == "-") {
                        b = -b;
                        que1.pollLast();
                    }
                    a = Integer.parseInt(que1.pollLast());
                    if (que1.peekLast() == "-") {
                        a = -a;
                        que1.pollLast();
                    }
                    que1.addLast(String.valueOf(a + b));
                    break;
                case '-':
                    b = Integer.parseInt(que1.pollLast());
                    if (que1.peekLast() == "-") {
                        b = -b;
                        que1.pollLast();
                    }
                    a = Integer.parseInt(que1.pollLast());
                    if (que1.peekLast() == "-") {
                        a = -a;
                        que1.pollLast();
                    }
                    que1.addLast(String.valueOf(a - b));
                    break;
                case '*':
                    b = Integer.parseInt(que1.pollLast());
                    if (que1.peekLast() == "-") {
                        b = -b;
                        que1.pollLast();
                    }
                    a = Integer.parseInt(que1.pollLast());
                    if (que1.peekLast() == "-") {
                        a = -a;
                        que1.pollLast();
                    }
                    que1.addLast(String.valueOf(a * b));
                    break;
            }
        }
    }
    public int calculate (String s) {
        Deque<String> que1 = new ArrayDeque<>();
        Deque<Character> que2 = new ArrayDeque<>();
        s = s.replace(" ", "");
        char[] ch = s.toCharArray();
        int a, b;
        for (int i = 0; i < ch.length; ++i) {
            switch (ch[i]) {
                case '(':
                    que2.addLast('(');
                    break;
                case '+':
                    while (!que2.isEmpty() && (que2.peekLast() == '+' || que2.peekLast() == '-' || que2.peekLast() == '*'))
                        function(que1, que2);
                    que2.addLast('+');
                    break;
                case '-':
                    if (i == 0 || (ch[i + 1] == '(' && !(ch[i - 1] <= '9' && ch[i - 1] >= '0'))||
                            i > 0 && !(ch[i - 1] <= '9' && ch[i - 1] >= '0') && ch[i - 1] != ')') {
                        que1.add("-");
                        break;
                    }
                    if (!que2.isEmpty() && que2.peekLast() != '(') {
                        while (!que2.isEmpty() && (que2.peekLast() == '+' || que2.peekLast() == '-' || que2.peekLast() == '*'))
                            function(que1, que2);
                    }
                    que2.addLast('-');
                    break;
                case '*':
                    while (!que2.isEmpty() && que2.peekLast() == '*') {
                        function(que1, que2);
                    }
                    que2.addLast('*');
                    break;
                case ')':
                    while (!que2.isEmpty() && que2.peekLast() != '(')
                        function(que1, que2);
                    que2.pollLast();
                    break;
                default:
                    int last = i + 1;
                    while (last < ch.length && ch[last] >= '0' && ch[last] <= '9') last++;
                    String ss = String.valueOf(ch, i, last - i);
                    que1.addLast(ss);
                    i = last - 1;
            }
        }
        while (!que2.isEmpty())
            function(que1, que2);
        return Integer.parseInt(que1.pollLast());
    }
}
全部评论

相关推荐

害怕一个人的小黄鸭胖乎乎:笑死了,没有技术大牛,招一堆应届生,不到半年,代码就成屎山了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务