算法通关村第四关|白银|栈的经典算法问题【持续更新】

1.括号匹配问题

1.1 有效的括号:用哈希表的 key 存储左半边符号,用 value 存储右半边符号,然后用栈去匹配左右括号,注意不仅要左右括号类型匹配,数量也要匹配。

java 复制代码
public boolean isValid(String s) {
	if (s.length() <= 1) {
        return false;
	}
	Map<Character, Character> smap = new HashMap<>();
	smap.put('(', ')');
	smap.put('{', '}');
	smap.put('[', ']');

	Stack<Character> stack = new Stack();
	for (int i = 0; i < s.length(); i++) {
        char item = s.charAt(i);
        // 左括号就直接入栈
        if (smap.containsKey(item)) {
            stack.push(item);
        } else {// 右括号就进行判断
            // 栈不为空才进行下一步判断,栈为空直接返回false
            if (!stack.isEmpty) {
                Character left = stack.pop();
                char right = smap.get(left);
                if (right != item) {
                    return false;
                }
            } else {
                return false;
            }
        }
    }
	// 循环结束以后如果栈里还有左括号,则返回false
	return stack.isEmpty();
}

1.2 有效括号生成:【持续更新】。

1.3 最长有效括号:【持续更新】。

2.最小栈

设计一个能在常数时间内检索到最小元素的栈。

java 复制代码
class MinStack {
    Deque<Integer> xStack;
    Deque<Integer> minStack;

    public MinStack() {
        xStack = new LinkedList<Integer>();
        minStack = new LinkedList<Integer>();
        minStack.push(Integer.MAX_VALUE);
    }

    public void push(int x) {
        // 这里用LinkedList表示栈,使用push方法,后续同理
        xStack.push(x);
        minStack.push(Math.min(minStack.peek(), x));
    }

    public void pop() {
        xStack.pop();
        minStack.pop();
    }

    public int top() {
        return xStack.peek();
    }

    public int getMin() {
        return minStack.peek();
    }
}

3.最大栈

设计一个支持查找或弹出栈中最大元素的栈。

java 复制代码
class MaxStack {
    Stack<Integer> stack;
    Stack<Integer> maxStack;

    public MaxStack() {
        stack = new Stack();
        maxStack = new Stack();
    }

    public void push(int x) {
        int max = maxStack.isEmpty() ? x : Math.max(maxStack.peek(), x);
        stack.push(x);
        maxStack.push(max);
    }

    public int pop() {
        maxStack.pop();
        return stack.pop();
    }

    public int top() {
        return stack.peek();
    }

    public int peekMax() {
        return maxStack.peek();
    }

    public int popMax() {
        int max = peekMax();
        Stack<Integer> buffer = new Stack();
        while (top() != max) {
            buffer.push(pop());
        }
        // 把最大值弹出
        pop();
        while (!buffer.isEmpty()) {
            push(buffer.pop());
        }
        return max;
    }
}

如果对您有帮助,请点赞关注支持我,谢谢!❤

如有错误或者不足之处,敬请指正!❤

个人主页:星不易 ♥

算法通关村专栏:不易|算法通关村 ♥

相关推荐
缓慢更新7 分钟前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
深圳市快瞳科技有限公司22 分钟前
野外鸟类AI识别落地实录:输入适配、结构化输出、去重聚合与置信度分流的工程实践
算法·计算机视觉·鸟类识别·鸟类ai识别·野外鸟类观测·林业调查
LMT流氓兔2 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
专注仿真2 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
小豆庄2 小时前
视频遮罩追踪退场后ID撞号的排查—多目标场景下的失效
opencv·算法·bug·视频·python3.11
Tisfy2 小时前
LeetCode 3882.网格图中最小异或路径:动态规划
算法·leetcode·动态规划
wangbing11253 小时前
平台介绍-modbus设备调试
java
D e re k ZH3 小时前
P5025 [SNOI2017] 炸弹
c++·算法
西索斯coding3 小时前
gpt-image-2.5-sunburst 和 gemini-3.1-flash-image 差多少?60 组项目素材的成功成本评测框架
java·linux·gpt·ai
A boy CDEF girl3 小时前
算法题专栏:优选算法
数据结构·算法·leetcode