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

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

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

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

个人主页:星不易

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

相关推荐
青灯文案1几秒前
SpringBoot 项目统一 API 响应结果封装示例
java·spring boot·后端
自身就是太阳2 分钟前
2024蓝桥杯省B好题分析
算法·职场和发展·蓝桥杯
我就是程序猿10 分钟前
tomcat的配置
java·tomcat
阳光阿盖尔16 分钟前
EasyExcel的基本使用——Java导入Excel数据
java·开发语言·excel
二十雨辰18 分钟前
[苍穹外卖]-12Apache POI入门与实战
java·spring boot·mybatis
程序员皮皮林18 分钟前
开源PDF工具 Apache PDFBox 认识及使用(知识点+案例)
java·pdf·开源·apache
蔚一19 分钟前
Java设计模式—面向对象设计原则(三) -----> 依赖倒转原则DIP(完整详解,附有代码+案例)
java·开发语言·设计模式·intellij-idea·依赖倒置原则
liang899924 分钟前
SpringSecurity原理解析(七):权限校验流程
java·开发语言
孙小二写代码26 分钟前
[leetcode刷题]面试经典150题之1合并两个有序数组(简单)
算法·leetcode·面试
little redcap31 分钟前
第十九次CCF计算机软件能力认证-1246(过64%的代码-个人题解)
算法