算法通关村第四关 - 白银挑战:经典问题之括号匹配问题、最大栈、最小栈、理解栈的特点:先进后出

括号匹配问题
  • 情景:

  • 给定一个字符串,仅包含"("、")"、"["、"]"等字符,要求如下:
  • 如果该字符中的左括号与右括号连续且成对出现,则说明该字符串有效,如下:
String str = "(){}[]" // 有效字符串
  • 实现一个算法,判断该字符串是否有效

  • 实现思路:

    • 构造一个HashMap,将左右括号以键值对形式存放进去

    • 构造一个栈Stack

    • 依次遍历字符串中的字符s,如果存在Map中的key值与s相等,则入栈

    • 如果该字符s不是key值,即不是左括号,则Stack出栈,计算value值是否与s相等

    • 不相等则说明括号不连续或不成对,该字符串是无效的

  • 这里利用的是栈的特性:先进先出,用来判断括号是否连续且成对(2023/08/26午)
  • 具体代码实现:

/**
     * 括号匹配问题
     *
     * @param s
     * @return
     */
    static boolean isValid(String s) {
        if (s.length() <= 1) {
            return false;
        }
        // 1.构造HashMap
        Map<Character, Character> smap = new HashMap<>();
        smap.put('(', ')');
        smap.put('{', '}');
        smap.put('[', ']');
        // 2.构造栈
        Stack<Character> stack = new Stack<>();
        // 3.遍历字符串
        for (int i = 0; i < s.length(); i++) {
            char item = s.charAt(i);
            // 入栈左括号
            if (smap.containsKey(item)) {
                stack.push(item);
                //入栈右括号
            } else {
                if (stack.isEmpty()) {
                    return false;
                }
​
                Character left = stack.pop();
                char rightChar = smap.get(left);
                if (rightChar != item) {
                    return false;
                }
            }
        }
        //
        return stack.isEmpty();
    }
最小栈
  • 实现快速获取栈中的最小元素

  • 我们设计这样一个数据结构:

    • 构建两个栈,一个栈存放入栈元素,另一个栈存放栈顶元素对应的此时栈中最小的元素

    • 即最小栈中的栈顶,始终维护栈中的最小元素(2023/08/26午)
    • 具体代码如下:

    /**
     * 最小栈
     */
    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) {
            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();
        }
    }

最大栈
  • 思路与最小栈基本一致

通关(过关挑战)

  • 这是要求:

给你一个栈,依次入栈1 2 3 4,请问以下出栈顺序可能出现吗?为什么?
  • 我们解释两个例子吧:(2023/08/26午)
出栈顺序:2 3 4 1 √
先出栈2,必然是1已经入栈了,再入栈3、出栈3,入栈4、出栈4,最后出栈1,没有问题
出栈顺序:1 4 2 3 ×
先入栈1、出栈1,要出栈4,必然是2 3 4依次入栈了,出栈4之后的出栈顺序只能是3 2,而不可能是2 3,故错误
  • 多做这样的例子,你就能彻底明白栈这个数据结构了:先进先出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值