• LeetCode227:基本计算器II


    感觉自己的思路还不错,比较简单清晰,代码量也比较少,没有用到记录运算符的变量或栈,就想把这个思路发一下博客。

    题目:

     实现一个基本的计算器来计算一个简单的字符串表达式的值。

    字符串表达式仅包含非负整数,"+", "-", "*", "/" 四种运算符和空格 " "。 整数除法仅保留整数部分。

    思路:

    使用一个栈用于暂存得不到计算的数字(无法确定优先级,比如当前是"+",那么可能下一个操作符是"*",所以暂时无法计算)。最终乘除操作符两侧的数会被得到计算并push进栈,最后相加即可。比如:

    2 - 1 + 3 * 4 - 4 / 2 * 1   =>  2 - 1 + [ 3 * 4 ] + [ -4 / 2 * 1 ] =>  最终栈里面的情况为 [2, -1, 12, -2],然后计算和即可。

    情况如下:

    • 如果是空格,跳过即可;
    • 如果是"+"或数字字符,则向栈中push进一个数字;
    • 如果是"-",则获得下一个数字,并向栈中push进它的负数形式;
    • 如果是"*",则获得下一个数字,并向栈中push进栈顶数字和下一个数字的乘积;
    • 如果是"/",则获得下一个数字,并向栈中push进栈顶数字和和一个数字的商。
    class Solution {
        public int calculate(String s) {
            Deque<Integer> stack = new ArrayDeque<>();
            char ch;
            int[] ret;
            for (int i = 0; i < s.length(); i++) {
                ch = s.charAt(i);
                if (ch == ' ') 
                    continue;
                ret = getNextNumber(s, i);
                if (Character.isDigit(ch) || ch == '+') {
                    stack.push(ret[0]);
                } else if (ch == '-') {
                    stack.push(-ret[0]);
                } else if (ch == '*') {
                    stack.push(stack.pop() * ret[0]);
                } else if (ch == '/') {
                    stack.push(stack.pop() / ret[0]);
                }
                i = ret[1]; //调整索引为,获得的下一个数字的末尾索引
            }
            // 返回计算结果
            int[] ans = {0};
            stack.forEach(num -> ans[0] += num);
            return ans[0];
        }
        // 返回下一个数字
        private int[] getNextNumber(String s, int i) {
            int num = 0;
            while (!Character.isDigit(s.charAt(i))) 
                i++;
            while (i < s.length() && Character.isDigit(s.charAt(i)))
                num = 10 * num + s.charAt(i++) - '0';
            return new int[] {num, i-1}; // 返回得到的数字及该数字最后一个数字字符的索引
        }
    }
    

      

  • 相关阅读:
    异步--记录
    css过渡——实现元素的飞入飞出
    使用touch操作图片
    .net mvc中epplus导出excel
    html无卡顿动画实现——requestAnimationFrame
    调用手机摄像头并上传图片--jquery ajax
    jquery form表单赋值封装
    记录
    .net mvc 使用 aspose.cells导出数据
    explain简介
  • 原文地址:https://www.cnblogs.com/yuanyb/p/11959305.html
Copyright © 2020-2023  润新知