分享

528,使用栈解基本计算器 II

 数据结构和算法 2023-06-10 发布于上海

If no one else guards the world, then I will come forward. 

如果没有别人保卫这个世界,那么我将挺身而出。

问题描述



给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分

示例 1:

输入:s = "3+2*2"

输出:7

示例 2:

输入:s = " 3/2 "

输出:1

示例 3:

输入:s = " 3+5 / 2 "

输出:5

提示:

  • 1<=s.length<=3*10^5

  • s由整数和算符('+', '-', '*', '/') 组成,中间由一些空格隔开

  • s表示一个有效表达式

  • 表达式中的所有整数都是非负整数,且在范围[0, 2^31 - 1]内

  • 题目数据保证答案是一个32-bit整数

使用栈解决



提示中说了,是一个有效的表达式,并且只有数字,空格和'+', '-', '*', '/'组成。我们知道算术运算式先算乘除后算加减。

  • 当遇到加法或减法的时候我们没法确定要不要计算,比如2+3*4。

  • 当遇到乘法或者除法的时候我们是可以直接计算的,因为他们的优先级比较高,比如4*2-3我们可以直接计算4*2的值。或者3-4*2也是可以的。

所以我们可以把不能确定是否要计算的先加入到栈中,可以直接计算的先计算,然后再加入到栈中,我们随便举个例子画个图来看下

代码比较简单,我们来看下

 1public int calculate(String s) {
2    //记录每个数字前面的符号,如果是乘法和除法就直接和前面的数字运算,
3    //然后在存放到栈中,如果是加法和减法直接存放到栈中
4    int preSign = '+';
5    Stack<Integer> stack = new Stack<>();
6    int length = s.length();
7    for (int i = 0; i < length; i++) {
8        int ch = s.charAt(i);
9        if (ch == ' ')//过滤掉空格
10            continue;
11        //如果是数字
12        if (ch >= '0' && ch <= '9') {
13            //找到连续的数字字符串,把它转化为整数
14            int num = 0;
15            while (i < length && (ch = s.charAt(i)) >= '0' && ch <= '9') {
16                num = num * 10 + ch - '0';
17                i++;
18            }
19            //这个是为了抵消上面for循环中的i++
20            i--;
21            //乘法和除法,运算之后在存放到栈中。加法和减法直接存放到栈中
22            if (preSign == '*') {
23                stack.push(num * stack.pop());
24            } else if (preSign == '/') {
25                stack.push(stack.pop() / num);
26            } else if (preSign == '+') {
27                stack.push(num);
28            } else if (preSign == '-') {
29                stack.push(-num);
30            }
31        } else {//记录前一个的符号
32            preSign = ch;
33        }
34    }
35    //把栈中的所有元素都取出来,计算他们的和
36    int res = 0;
37    while (!stack.empty()) {
38        res += stack.pop();
39    }
40    return res;
41}

总结



算术计算,优先级高的先计算,计算的结果入栈,优先级低的直接入栈,最后再统计栈中所有元素的和即可。

519,单调栈解下一个更大元素 I

508,使用栈来判断有效的括号

500,验证栈序列

416,剑指 Offer-用两个栈实现队列

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约