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

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

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

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

个人主页:星不易

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

相关推荐
猿究院--王升2 小时前
jvm三色标记
java·jvm·算法
一车小面包2 小时前
逻辑回归 从0到1
算法·机器学习·逻辑回归
妮妮学代码2 小时前
c#:TCP服务端管理类
java·tcp/ip·c#
兔老大RabbitMQ3 小时前
git pull origin master失败
java·开发语言·git
探索java3 小时前
Netty Channel详解:从原理到实践
java·后端·netty
tt5555555555554 小时前
字符串与算法题详解:最长回文子串、IP 地址转换、字符串排序、蛇形矩阵与字符串加密
c++·算法·矩阵
tuokuac4 小时前
maven与maven-archetype-plugin版本匹配问题
java·maven
元亓亓亓4 小时前
LeetCode热题100--101. 对称二叉树--简单
算法·leetcode·职场和发展
ankleless5 小时前
Spring Boot 实战:从项目搭建到部署优化
java·spring boot·后端
不会学习?5 小时前
算法03 归并分治
算法