【java-数据结构17-栈的例题2】

  上篇文章,我们介绍了一些经典例题,本篇文章,我们将继续讲解例题,来加深理解~觉得小编讲的还可以的可以留个关注支持一下~话不多说,上正文~

1. 出栈入栈次序匹配
 

  输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

我们借助图片理解

此时我们返回true即可 

 1.我们定义i j两个下标,遍历数组

 2.让i往栈里放,此时就将栈顶的元素与j对比,看看是不是跟j相等,如果不相等,i就往后走,直到相等时候,如图

3.此时就可以弹出栈顶元素,并且j++

如图

 

此时相等,继续出栈 ,如图

以此类推,这里直接看最后结果,

 

以上是匹配的情况,下面,我们再来介绍一个不匹配的情况 

4.最后我们只需看栈是否为空即可 

代码如下

 public boolean IsPopOrder (int[] pushV, int[] popV) {
       Stack<Integer> stack = new Stack<>();
       int j = 0;
        int [] pushA = {};
        int [] popA = {};
        for (int i = 0; i < pushA.length; i++) {
            stack.push(pushA[i]);
            while (!stack.empty()&&j <popA
                    .length&&stack.peek() == popA[j]){
                stack.pop();
                j++;
                
            }
        }
        return stack.empty();
    }

2.最小栈

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

入栈

1.定义两个栈,一个作为正常栈,一个用来存放最小值,也就是说,最小栈每次入栈都要和栈顶元素比较,如果比栈顶元素小,就要入栈,注意:也就是说,第一次入栈操作,两个栈都要进行入栈,如图

此时,最小值栈的栈顶,就是最小值 

那么,出栈操作呢?

 普通栈正常出栈,但每次出栈都要跟最小栈栈顶元素进行比较,如果正常栈的元素等于最小栈栈顶的元素,那么最小栈也要进行出栈操作,如图

代码如下

class MinStack {
    private Stack<Integer> stack;
    private Stack<Integer> minStack;

    public MinStack() {
        this.stack = new Stack<>();
        this.minStack = new Stack<>();

    }

    public void push(int val) {

        stack.push(val);
        if (minStack.empty()){
            minStack.push(val);
        }else {
            if (val <= minStack.peek()){
                minStack.push(val);
            }
        }
    }

    public void pop() {
        if (!stack.empty()){
            int ret = stack.pop();
            
            if (minStack.peek() == ret){
                minStack.pop();
            }
        }
    }

    public int top() {
        if (stack.empty()){
            return -1;
        }
        return stack.peek();
     
    }

    public int getMin() {
        if (minStack.empty()){
            return -1;
        }
        return minStack.peek();

    }
}

  此时,我们栈的例题就到此结束 了,下一篇文章我们将会进入队列的学习,敬请期待吧~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值