第四关|栈经典问题

1、括号匹配

leetcode20

示例:

输入:s = "()[]{}"

输出:true

用HashMap将每对左括号作key,右括号作value

遍历字符串,当前元素是key则压栈;遇到不是key则弹出栈顶,若栈顶所对应的value值与当前元素不同说明不匹配,不是一对括号。若应当弹出栈顶时,栈中无元素,说明只有右括号,没有左括号,匹配失败。若遍历完后,栈中不为空,则说明有多余的左括号没有匹配上,匹配失败。

public class IsValid {
    public static void main(String[] args) {

        String s = "[]{}(){{}}";
        System.out.println(isValid(s));

    }

    public static 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{

                if(!stack.empty()){
                    Character left = stack.pop();
                    Character right = smap.get(left);
                    if(right != item)
                        return false;
                }else{
                    return false;
                }

            }
        }
        return stack.empty();
    }
}

 2、最小栈

leetcode155

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

MinStack() 初始化堆栈对象

void push(int val) 将元素val推入堆栈

void pop() 删除堆栈顶部的元素

int top() 获取堆栈顶部的元素

int getMin() 获取堆栈中的最小元素

用辅助栈存每次的最小值,在每入栈1个元素的同时,对比当前值和辅助栈栈顶,将较小值压入辅助栈。即入栈1个,辅助栈入1个目前最小的。

pop时,每出1个,辅助栈出1个。

public class MinStack {
    Deque<Integer> dataStack;
    Deque<Integer> minStack;

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

    public void push(int val){
        dataStack.push(val);
        minStack.push(Math.min(val,minStack.peek()));
    }

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

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

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

}

3、最大栈

leetcode716

MaxStack() 初始化栈对象

void push(int x) 将元素 x 压入栈中。

int pop() 移除栈顶元素并返回这个元素。

int top() 返回栈顶元素,无需移除。

int peekMax() 检索并返回栈中最大元素,无需移除。

int popMax() 检索并返回栈中最大元素,并将其移除。

如果有多个最大元素,只要移除 最靠近栈顶 的那个。

前几个操作与最小栈类似

对于 popMax(),用peekMax()检索最大元素,一直弹出原始栈中的元素并压入新栈(原栈栈顶不一定就是最大元素),直到是最大元素。弹出最大元素,再把本不应该弹出的元素(只应该弹最近的最大元素)从新栈压回原栈。

public class MaxStack {

    Stack<Integer> dataStack;
    Stack<Integer> maxStack;

    public MaxStack(){
        dataStack = new Stack<>();
        maxStack = new Stack<>();
    }

    public void push(int x){
        dataStack.push(x);
        int max = maxStack.isEmpty() ? x : maxStack.peek();
        maxStack.push(max > x ?  max : x);
    }

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

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

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

    public int popMax(){
        int max = maxStack.peek();

        Stack<Integer> buffer = new Stack<>();

        while(top() != max){
            buffer.push(dataStack.pop());
        }
        pop();
        while(!buffer.empty()){
            push(buffer.pop());
        }

        return max;
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值