224 227 772 Basic Calculator I, II, III

5212 단어
224 Calculator I의 코드입니다.여기서 팝스틱을 함수로 추출합니다.몇 번이나 나타났으니까.
class Solution {
    public int calculate(String s) {
        
        // two stack operator stack and operand stack
        
        // build two stack;
        Deque ops = new ArrayDeque<>();
        Deque nums = new ArrayDeque<>();
        
        //while loop
        int pt = 0;
        while (pt < s.length()) {
            if (s.charAt(pt) == ' ') {
                pt++;
            } else if ("+-)".indexOf(s.charAt(pt)) >= 0) {
                popStack(ops, nums);
                if (s.charAt(pt) == ')')  {
                    ops.pop();
                    pt++;
                } else {
                    ops.push(s.charAt(pt++)); // + -     
                }
            } else if (s.charAt(pt) == '(') {
                ops.push(s.charAt(pt++));
            } else { // number    
                int num = 0;
                while (pt < s.length() && Character.isDigit(s.charAt(pt))) {
                    num *= 10;
                    num += s.charAt(pt++) - '0';
                }
                nums.push(num);
            }
        }
        popStack(ops, nums);
        return nums.pop();
    }
    private void popStack(Deque ops, Deque nums) {
        while (!ops.isEmpty() && ops.peek() != '(') {
                    int num2 = nums.pop();
                    int num1 = nums.pop();
                    char op = ops.pop();
                    nums.push(num1 + (op == '+' ? 1 : -1) * num2);
        }
    }
}

227II 코드는 괄호가 없어서 Stack을 사용하지 않았습니다.sum,last,op만 사용했습니다.sum는 청산된 수를 저장하는 데 사용됩니다.last는 진행 중인 수를 저장하는 데 사용됩니다.예를 들어 현재 진행 중인 곱셈 초기화last는 1,op는 *.sum은 0
class Solution {
    public int calculate(String s) {
        int sum = 0, last = 1;
        char op = '*';
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == ' ') continue;
            if (s.charAt(i) == '+' || s.charAt(i) == '-') {
                sum += last;
                last = s.charAt(i) == '+' ? 1 : -1;
                op = '*';
            } else if (s.charAt(i) == '*' || s.charAt(i) == '/') {
                op = s.charAt(i);
            } else {
                int num = 0;
                while (i < s.length() && Character.isDigit(s.charAt(i))) {
                    num *= 10;
                    num += s.charAt(i++) - '0';
                }
                i--;
                if (op == '*') last *= num;
                else last /= num;
            }
        }
        return sum + last;
    }
}

III 코드에도 버그가 하나 나왔는데, 바로 좌우 괄호의 우선순위입니다.오른쪽 괄호가 왼쪽 괄호를 만났을 때, 정지하십시오.
class Solution {
    public int calculate(String s) {
        Deque nums = new LinkedList<>();
        Deque ops = new LinkedList<>();
        for (int i = 0; i < s.length(); i++) {
            // space  do nothing
            if (s.charAt(i) == ' ') {
                continue;
            } else if ("+-)".indexOf(s.charAt(i)) >= 0) {
                popStack(nums, ops, s.charAt(i));
                if (s.charAt(i) == ')') {
                    ops.pop();
                } else {
                    ops.push(s.charAt(i));
                }
            // + - )  pop till ( or empty
            } else if ("*/".indexOf(s.charAt(i)) >= 0) {
            // * / pop till + - or (
                popStack(nums, ops, s.charAt(i));
                ops.push(s.charAt(i));
            } else if (s.charAt(i) == '(') {
                 // ( put in
                ops.push('(');
            } else {
                //number //remember i -- or 
                int num = s.charAt(i) - '0';
                while (i + 1 < s.length() && Character.isDigit(s.charAt(i + 1))) {
                    num *= 10;
                    num += s.charAt(++i) - '0';
                }
                nums.push(num);
            }
        }
        popStack(nums,ops, '+');
        return nums.pop();
    }
    private void popStack(Deque nums, Deque ops, char lastOp) {
        while(!ops.isEmpty() && getPriority(ops.peek()) >=  getPriority(lastOp)) {
            int num2 = nums.pop();
            int num1 = nums.pop();
            nums.push(calc(num1, num2, ops.pop()));
        }
    }
    private int getPriority(char c) {
        if ("*/".indexOf(c) >= 0) return 3;
        if ("+-".indexOf(c) >= 0) return 2;
        if (")".indexOf(c) >= 0) return 1; //            
        //                 。 
        return 0;
    }
    private int calc(int a, int b, char c) {
        if (c == '+') return a + b;
        if (c == '-') return a - b;
        if (c == '*') return a * b;
        if (c == '/') return a / b;
        return 0;
    }
}

좋은 웹페이지 즐겨찾기