首页 > 其他分享 >每日一题:Leetcode-224 基本计算器

每日一题:Leetcode-224 基本计算器

时间:2024-09-02 14:55:09浏览次数:5  
标签:numStack opStack num1 num2 pop 操作符 计算器 224 Leetcode

力扣题目

解题思路

java代码

力扣题目:

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

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

示例 1:

输入:s = "1 + 1"
输出:2

示例 2:

输入:s = " 2-1 + 2 "
输出:3

示例 3:

输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23

解题思路:

算法原理
这道题使用两个栈,一个数字栈 numStack 存储数字,一个操作符栈 opStack 存储操作符,通过遍历输入的字符串,按照运算规则进行计算。

思路

  1. 遍历字符串中的每个字符。
  2. 如果是数字,通过一个循环将连续的数字提取出来并转换为整数,然后压入数字栈。
  3. 如果是 ( ,直接压入操作符栈。
  4. 如果是 + 或 - ,先计算操作符栈中优先级高于或等于当前操作符的表达式,然后将当前操作符压入操作符栈。
  5. 如果是 ) ,计算操作符栈中直到遇到 ( 的表达式。
  6. 遍历结束后,处理操作符栈中剩余的操作符。

代码分析

  • 在 calculate 方法中,使用两个嵌套的循环来处理数字和操作符。
    • 外层循环遍历字符串。
    • 内层循环处理连续的数字。
  • 对于不同类型的字符,分别进行相应的处理:数字入数字栈,特定操作符进行计算或入操作符栈。
  • 最后通过处理操作符栈中剩余的操作符得到最终结果。

时间复杂度:O(n),其中 n 是输入字符串的长度,需要遍历字符串一次。

空间复杂度:O(n),主要用于存储数字栈和操作符栈,它们的大小最大可能为输入字符串的长度。

java代码:

package org.example;

import java.util.Stack;

public class Leetcode224 {

    public static void main(String[] args) {
        Leetcode224 leetcode224 = new Leetcode224();
        System.out.println(leetcode224.calculate("(1+(4+5+2)-3)+(6+8)"));
    }

    public int calculate(String s) {
        Stack<Integer> numStack = new Stack<>();
        Stack<Character> opStack = new Stack<>();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);

            if (Character.isDigit(c)) {
                int num = 0;
                while (i < s.length() && Character.isDigit(s.charAt(i))) {
                    num = num * 10 + (s.charAt(i) - '0');
                    i++;
                }
                i--;
                numStack.push(num);
            } else if (c == '(') {
                opStack.push(c);
            } else if (c == '+' || c == '-') {
                while (!opStack.isEmpty() && opStack.peek()!= '(') {
                    int num2 = numStack.pop();
                    int num1 = numStack.pop();
                    char op = opStack.pop();

                    if (op == '+') {
                        numStack.push(num1 + num2);
                    } else {
                        numStack.push(num1 - num2);
                    }
                }
                opStack.push(c);
            } else if (c == ')') {
                while (opStack.peek()!= '(') {
                    int num2 = numStack.pop();
                    int num1 = numStack.pop();
                    char op = opStack.pop();

                    if (op == '+') {
                        numStack.push(num1 + num2);
                    } else {
                        numStack.push(num1 - num2);
                    }
                }
                opStack.pop();
            }
        }

        while (!opStack.isEmpty()) {
            int num2 = numStack.pop();
            int num1 = numStack.pop();
            char op = opStack.pop();

            if (op == '+') {
                numStack.push(num1 + num2);
            } else {
                numStack.push(num1 - num2);
            }
        }

        return numStack.peek();
    }
}

更多详细内容同步到公众号,感谢大家的支持!

每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项

标签:numStack,opStack,num1,num2,pop,操作符,计算器,224,Leetcode
From: https://blog.csdn.net/LIUCHANGSHUO/article/details/141805384

相关文章

  • 【LeetCode】两数之和
    题目:在数组中找到2个数之和等于给定值的数字,结果返回2个数字在数组中的下标。要求时间复杂度为 O(n)。解题分析:作者:halfrost链接:https://leetcode.cn/leetbook/read/leetcode-cookbook/5lu4og/顺序扫描数组,对每一个元素,在map中找能组合给定值的另一半数字,如果找......
  • Leetcode37-和相等的子数组(2395)
    1、题目给你一个下标从0开始的整数数组nums,判断是否存在两个长度为2的子数组且它们的和相等。注意,这两个子数组起始位置的下标必须不相同。如果这样的子数组存在,请返回true,否则返回false。子数组是一个数组中一段连续非空的元素组成的序列。示例1:输入......
  • leetcode 75. Sort Colors & 三路快速排序
    leetcode75.SortColors&三路快速排序只有0和1的情况在这种简化情况下,我们只需要顺序遍历数组,遇到0就放到前面即可。classlocalExperiment{public:voidsort01(std::vector<int>&nums){intzero_ptr=0;for(inti=0;i<nums.size();......
  • 二叉树的直径(LeetCode)
    题目给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示。解题classTreeNode:def__init__(self,val=0,left=......
  • 【JavaScript】LeetCode:6-10
    文章目录6轮转数组7买卖股票的最佳时机Ⅰ8买卖股票的最佳时机Ⅱ9两数之和10字母异位词分组6轮转数组数组题目要求最终结果返回nums。方法1:拼接数组,n=nums.concat(nums);。方法2:数组直接截取,这里提供方法2的代码。/***@param{number[]}nums*@param......
  • 416. 分割等和子集(leetcode)
    https://leetcode.cn/problems/partition-equal-subset-sum/description/01背包问题,需要考虑到如何把这个问题转化成01背包问题转换成01背包问题后,如何定义f[i]状态来表示这里有两种方式:1.按照传统01背包表示,即前i个物品中选,体积小于等于j的最大价值,这里体积和价值是等价......
  • Leetcode3234. 统计 1 显著的字符串的数量
    EverydayaLeetcode题目来源:3234.统计1显著的字符串的数量解法1:枚举左端点注意到,如果子串中的0非常多,多到0的个数的平方比1的个数都要大,那么这样的子串必然不是1显著子串。设cnt0为子串中的0的个数,cnt1为子串中的1的个数,那么必须满足:cnt0*cnt0<=......
  • 【Leetcode_Hot100】哈希
    哈希1.两数之和49.字母异位词分组128.最长连续序列1.两数之和方法一:HashMap在元素放入数组之前就进行判断,保证了不会取出同一个元素的情况,,例如[3,3],如果先将数组中的所有元素放入hashMap,再判断是否存在,则返回结果为[1,1],不符合题意。classSolution{publicint[......
  • 数据结构:(LeetCode572)另一棵子树
    给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。示例1:......
  • LeetCode - 6 Z 字形变换
    题目来源6.Z字形变换-力扣(LeetCode) 题目描述将一个给定字符串s根据给定的行数numRows,以从上往下、从左到右进行Z字形排列。比如输入字符串为"PAYPALISHIRING"行数为3时,排列如下:P A H NAPLSIIGY I R之后,你的输出需要从左往右逐......