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

}
相关推荐
Jerry2 小时前
LeetCode 189. 轮转数组
算法
Jerry3 小时前
LeetCode 739. 每日温度
算法
2601_954526757 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
叩码以求索8 小时前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
c2385610 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
aaaameliaaa11 小时前
指针之总结
c语言·笔记·算法
宵时待雨11 小时前
优选算法专题9:哈希表
数据结构·算法·散列表
txzrxz11 小时前
最短路问题——Dijkstra 算法
数据结构·c++·算法·最短路·优先队列
gwf21611 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
noipp12 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu