LeetCode之栈

20. 有效的括号

java 复制代码
class Solution {

    public boolean isValid(String s) {
        // 边界处理:如果字符串长度是奇数,则不可能配对成功
        if (s.length() % 2 != 0) {
            return false;
        }

        // 创建一个映射,存储闭合括号对应的开括号
        Map<Character,Character> map = new HashMap<>();
        map.put(')', '(');
        map.put('}', '{');
        map.put(']', '[');

        // 创建一个栈,用于存储开括号
        Deque<Character> stack = new ArrayDeque<>();

        // 遍历字符串中的每一个字符
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);

            // 如果是闭合括号
            if (map.containsKey(c)) {

                // 检查栈顶是否与当前闭合括号对应的开括号匹配
                if (stack.isEmpty() || stack.peek() != map.get(c)) {
                    // 不匹配,返回false
                    return false;
                }
                // 匹配成功,弹出栈顶的开括号
                stack.pop();
            } else {
                // 如果是开括号,压入栈中
                stack.push(c);
            }
        }
        // 检查栈是否为空,栈空表示所有开括号都有对应的闭合括号
        return stack.isEmpty();
    }

}

71. 简化路径

java 复制代码
class Solution {
    // 方法 simplifyPath 接收一个字符串 path,返回简化后的路径
    public String simplifyPath(String path) {
        // 根据 "/" 分割路径字符串,得到各级目录名称
        String[] names = path.split("/");
        // 创建一个双端队列用于存储有效的路径部分
        Deque<String> stack = new ArrayDeque<String>();

        // 遍历每个目录名
        for (String name : names) {
            // 如果目录名是 "..",从栈中弹出上一级目录(如果栈不为空)
            if ("..".equals(name)) {
                if (!stack.isEmpty()) {
                    stack.pollLast(); // 弹出栈顶元素,表示回到上一级
                }
            // 如果目录名有效(非空且不是 ".")
            } else if (name.length() > 0 && !".".equals(name)) {
                stack.offerLast(name); // 将有效的目录名加入栈中
            }
        }

        // 用 StringBuffer 构建简化后的路径
        StringBuffer ans = new StringBuffer();
        // 如果栈为空,说明路径为根目录,结果设为 "/"
        if (stack.isEmpty()) {
            ans.append('/');
        } else {
            // 遍历栈中的内容,构建最终简化路径
            while (!stack.isEmpty()) {
                ans.append('/'); // 在每个目录前加上 "/"
                ans.append(stack.pollFirst()); // 取出并添加目录名
            }
        }
        // 将构建好的路径转换为字符串并返回
        return ans.toString();
    }
}

155. 最小栈

java 复制代码
class MinStack {
    // 主栈,存储正常的整数值
    Deque<Integer> stack;
    // 辅助栈,存储当前的最小值
    Deque<Integer> minStack;

    // 构造函数,初始化主栈和最小值栈
    public MinStack() {
        stack = new ArrayDeque<>(); // 初始化主栈
        minStack = new ArrayDeque<>(); // 初始化最小值栈
        minStack.push(Integer.MAX_VALUE); // 推入一个最大值作为初始最小值
    }

    // 推入新元素到主栈
    public void push(int val) {
        stack.push(val); // 将值推入主栈
        // 将当前值与 minStack 顶部元素比较,推入较小的值到 minStack
        minStack.push(Math.min(val, minStack.peek()));
    }

    // 弹出主栈的顶部元素
    public void pop() {
        stack.pop(); // 从主栈弹出顶部元素
        minStack.pop(); // 从最小值栈弹出对应元素
    }

    // 获取主栈的顶部元素
    public int top() {
        return stack.peek(); // 返回主栈的顶部元素
    }

    // 获取当前栈的最小值
    public int getMin() {
        return minStack.peek(); // 返回最小值栈的顶部元素(即当前最小值)
    }
}

150. 逆波兰表达式求值

java 复制代码
class Solution {
    public int evalRPN(String[] tokens) {
        
        Deque<Integer> stack = new LinkedList<>();
        for (int i = 0; i < tokens.length; i++) {
            if (isNumber(tokens[i])) {
                stack.push(Integer.parseInt(tokens[i]));
            } else {
                Integer a = stack.pop();
                Integer b = stack.pop();
                switch(tokens[i]) {
                    case "+":
                        stack.push(b + a);
                        break;
                    case "-":
                        stack.push(b - a);
                        break;
                    case "*":
                        stack.push(b * a);
                        break;
                    case "/":
                        stack.push(b / a);
                        break;
                }
            }
        }
        return stack.pop();
    }

    public boolean isNumber(String token) {
        return !("+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token));
    }

}
相关推荐
半夏微凉半夏殇43 分钟前
x11与weston对比,优先选哪个
leetcode·均值算法·eclipse
2501_906565121 小时前
数学之美探究
算法
oier_Asad.Chen1 小时前
【洛谷题解/AcWing题解/OI学习笔记】洛谷P2868【USACO07DEC】Sightseeing Cows G(01分数规划求最大比率)
算法·图论·spfa·二分·负环
leisoo80973 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法
luj_17685 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
郝学胜-神的一滴5 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
爱编程的小新☆6 小时前
【LeetCode】从递归到 Flood Fill:5 道题吃透 DFS 的选择、回溯与标记
java·算法·leetcode·深度优先·回溯·flood fill
Water_Sunzhipeng6 小时前
2024牛客暑期多校训练营1
算法
hetao17338376 小时前
2026-08-09~08-14 hetao1733837 的刷题记录
c++·算法
技术小黑6 小时前
RNN算法实战系列06 | LSTM 实现糖尿病探索与预测
rnn·算法·lstm