算法:基本计算器

147 阅读1分钟

基本计算器

题目描述:

题目来源:力扣

给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格  。
整数除法仅保留整数部分。
示例 1: 输入: "3+2*2" 输出: 7
示例 2: 输入: " 3/2 " 输出: 1
示例 3: 输入: " 3+5 / 2 " 输出: 5
说明:
你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。

JAVA版代码:

class Solution {
    public int calculate(String s) {
        // 数字栈
        Stack<Integer> stackNum = new Stack<>();
        
        // 前一个符号
        char preSign = '+';
        
        int num = 0;
        
        // 替换空格后,一定要加 s=..
        s = s.replaceAll(" ","");
        
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);

            // 如果是数字,处理多位数问题
            if (Character.isDigit(ch)) { 
                num = num * 10 + (ch - '0');
            }

            // 如果是符号,或者最后一次,最后一次很重要!!!
            if (!Character.isDigit(ch) || i == s.length() - 1) { 
                if (preSign == '+') {
                    stackNum.push(num);
                } else if (preSign == '-') {
                    stackNum.push(-num);
                } else if (preSign == '*') { // 优先级高,直接计算
                    stackNum.push(stackNum.pop() * num);
                } else if (preSign == '/') { // 优先级高,直接计算
                    stackNum.push(stackNum.pop() / num);
                }
                // 将当前符号保存
                preSign = ch;
                num = 0;
            }
        }

        int result = 0;
        while (!stackNum.isEmpty()) {
            result += stackNum.pop();
        }

        return result;
    }
}