leetcode----227. Basic Calculator II

本文详细解析了如何使用两个栈(操作数栈和操作符栈)来实现一个基本的计算器功能,能够处理包含加、减、乘、除的数学表达式。通过先处理乘除法再处理加减法的策略,有效地解决了表达式的计算问题。

链接:

https://leetcode.com/problems/basic-calculator-ii/

大意:

实现一个计算器。给定一个字符串s,字符串s中的字符由'0'-'9'的数字以及'+'、'-'、'*'、'/'以及空格组成。要求求出字符串s所代表表达式的结果。例子:

思路:

构造两个栈,一个为操作数栈,里面存放操作数(整数);一个为操作符栈,里面存放四种运算符(字符)。

  1. 将字符串中的所有操作数放入放入操作数栈,所有操作符放入操作符栈
  2. 根据操作数栈和操作符栈进行乘除法运算
  3. 最后进行加减法运算 

代码:

// 两个相邻数字之间没有空格
class Solution {
    public int calculate(String s) {
        ArrayList<Integer> nums = new ArrayList<>(); // 构造操作数栈
        ArrayList<Character> op = new ArrayList<>(); // 构造操作符栈
        char pre = ' ';
        for (char c : s.toCharArray()) {
            if (c != ' ') {
                // 当前字符是数字
                if (c >= '0' && c <= '9') {
                    // 如果前一个字符也是数字
                    if (pre >= '0' && pre <= '9') {
                        if (nums.size() > 0)
                            nums.add(nums.remove(nums.size() - 1) * 10 + (c - '0'));
                        else 
                            nums.add(c - '0');    
                    } else {
                        nums.add(c - '0');
                    }
                } else { // 当前数字是操作符
                    op.add(c);
                }
            }
            pre = c;
        }
        int idx = 0;
        // 先处理乘除法
        while (idx < op.size()) {
            char c = op.get(idx);
            if (c == '*' || c == '/') {
                op.remove(idx);
                int num1 = nums.get(idx), num2 = nums.get(idx + 1);
                if (c == '*')
                    nums.set(idx, num1 * num2);
                else 
                    nums.set(idx, num1 / num2);
                nums.remove(idx + 1);
                continue;
            }
            idx++;
        }
        // 再处理加减法
        int res = nums.get(0);
        idx = 0;
        while (idx < op.size()) {
            char c = op.get(idx);
            if (c == '+')
                res += nums.get(idx + 1);
            if (c == '-')
                res -= nums.get(idx + 1);
            idx++;
        }
        return res;
    }
}

结果:

结论:

使用栈思想解决的一个经典问题,但是感觉代码有点冗长。。。 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值