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));
    }

}
相关推荐
明朝百晓生5 分钟前
【强化学习】【1】【PyTorch】【强化学习简介优化框架】
算法
loser~曹11 分钟前
基于快速排序解决 leetcode hot215 查找数组中第k大的数字
数据结构·算法·leetcode
Dream it possible!16 分钟前
LeetCode 热题 100_打家劫舍(83_198_中等_C++)(动态规划)
c++·算法·leetcode·动态规划
zhouziyi070122 分钟前
【蓝桥杯14天冲刺课题单】Day 8
c++·算法·蓝桥杯
SylviaW0825 分钟前
python-leetcode 62.搜索插入位置
数据结构·算法·leetcode
舔甜歌姬的EGUMI LEGACY2 小时前
【算法day28】解数独——编写一个程序,通过填充空格来解决数独问题
算法
welkin2 小时前
KMP 个人理解
前端·算法
半桔2 小时前
红黑树剖析
c语言·开发语言·数据结构·c++·后端·算法
eason_fan2 小时前
前端面试手撕代码(字节)
前端·算法·面试
今天_也很困2 小时前
牛客2025年愚人节比赛
c++·算法