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

}
相关推荐
算AI14 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
hyshhhh16 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
杉之17 小时前
选择排序笔记
java·算法·排序算法
烂蜻蜓17 小时前
C 语言中的递归:概念、应用与实例解析
c语言·数据结构·算法
OYangxf17 小时前
图论----拓扑排序
算法·图论
我要昵称干什么17 小时前
基于S函数的simulink仿真
人工智能·算法
AndrewHZ18 小时前
【图像处理基石】什么是tone mapping?
图像处理·人工智能·算法·计算机视觉·hdr
念九_ysl18 小时前
基数排序算法解析与TypeScript实现
前端·算法·typescript·排序算法
守正出琦18 小时前
日期类的实现
数据结构·c++·算法
ChoSeitaku18 小时前
NO.63十六届蓝桥杯备战|基础算法-⼆分答案|木材加工|砍树|跳石头(C++)
c++·算法·蓝桥杯