自学内容网 自学内容网

基本计算器 II

题目解析

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

整数除法仅保留整数部分。

你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

示例 1:

输入:s = “3+2*2”
输出:7
示例 2:

输入:s = " 3/2 "
输出:1
示例 3:

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

提示:

1 <= s.length <= 3 * 105
s 由整数和算符 (‘+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开
s 表示一个 有效表达式
表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
题目数据保证答案是一个 32-bit 整数

下面是题目的链接:
基本计算器||

在这里插入图片描述

  • 解析:
    因为给定的是一个字符串s ,所以要想遍历字符串,先要将它转化成一个字符数组。我们要利用栈的性质来进行模拟算术运算,因为只有加减乘除,所以乘除的优先级是高的。先定义一个变量 op 表示运算符,当我们遇到加号和减号时,直接将加号或减号前的数字压入栈中。为了方便最后的计算,当遇到是减号时,压入栈中的数字是负的即可,这样,最后计算时,全部相加在一起就可以了。当我们遇到乘除时,将栈顶元素弹出和下一个数运算即可。还有一点,当遇到不是个位数时,我们需要继续往后遍历,tmp * 10+ss[ i ] 就可以解决这个问题。
    值得注意的是,当遇到空格时,直接 i++ 就可以跳过了。

解题

class Solution {
        public int calculate(String s) {
            char op = '+';
            Stack<Integer> ret = new Stack<>();
            int n = s.length();
            char[] ss = s.toCharArray();
            int i = 0;
            while (i < n){
                if (ss[i] == ' '){
                    i++;
                } else if (ss[i] >= '0' && ss[i] <= '9') {
                    int tmp = 0;
                    while (i < n && ss[i] >= '0' && ss[i] <= '9'){
                        tmp = tmp * 10 + (ss[i] - '0');
                        i++;
                    }
                    if (op == '+'){
                        ret.push(tmp);
                    } else if (op == '-') {
                        ret.push(-tmp);
                    }else if (op == '*'){
                        ret.push(ret.pop()*tmp);
                    }else {
                        ret.push(ret.pop()/tmp);
                    }
                }else {
                    op = ss[i];
                    i++;
                }
            }

            int sum = 0;
            while (!ret.isEmpty()){
                sum += ret.pop();
            }

            return sum;
        }
    }

在这里插入图片描述

小结

对于这种模拟运算的题,都可以使用栈的优先级特性来进行解决。


原文地址:https://blog.csdn.net/Ashle_MIN/article/details/142987818

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!