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

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

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

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

个人主页:星不易

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

相关推荐
凭君语未可5 分钟前
豆包MarsCode:小C点菜问题
算法
小张认为的测试10 分钟前
Liunx上Jenkins 持续集成 Java + Maven + TestNG + Allure + Rest-Assured 接口自动化项目
java·ci/cd·jenkins·maven·接口·testng
C语言魔术师25 分钟前
【小游戏篇】三子棋游戏
前端·算法·游戏
自由自在的小Bird25 分钟前
简单排序算法
数据结构·算法·排序算法
蘑菇丁39 分钟前
ansible批量生产kerberos票据,并批量分发到所有其他主机脚本
java·ide·eclipse
呼啦啦啦啦啦啦啦啦2 小时前
【Redis】持久化机制
java·redis·mybatis
我想学LINUX3 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
王老师青少年编程7 小时前
gesp(C++五级)(14)洛谷:B4071:[GESP202412 五级] 武器强化
开发语言·c++·算法·gesp·csp·信奥赛
DogDaoDao7 小时前
leetcode 面试经典 150 题:有效的括号
c++·算法·leetcode·面试··stack·有效的括号