栈的压入与弹出序列

该博客讨论了如何判断一个给定的序列是否为栈的合法弹出序列。通过创建临时栈,按压入顺序将元素存入,然后比较弹出序列,当弹出序列的元素与栈顶元素匹配时进行弹出操作。文章举例解释了判断过程,并提供了Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

思路:创建一个临时栈,用来存压入序列的元素,过程举例说明,比如压入序列1 2 3 4 5,弹出序列45321,就要从压入序列第一位开始,存放到临时栈中,首先是1 2 3 4,这时发现4和弹出序列的第一位相等,于是对栈的操作变成将4弹出,这样栈中剩下1 2 3,而弹出序列的下一位是5,栈顶是3,需要继续将压入序列的元素存到栈中,5进栈,然后与弹出序列的第一位(之前第一位是4,因为已经满足要求并弹出,所以第一位变成5),这样栈顶元素变为3,与弹出序列剩余的相同,因此依次弹出3 2 1,符合要求。

另一个例子,压入序列 1 2 3 4 5,弹出序列 4 3 5 1 2 。

同理,1 2 3 4进栈,弹出4 3 ,然后5进栈,弹出5,此时栈顶是2,并且压入队列都已进栈,所以不符合。

以下是Java代码,

1、

import java.util.ArrayList;
import java.util.Stack;
  
public class Solution {
    public boolean IsPopOrder(ArrayList<Integer> pushA,ArrayList<Integer> popA) {
        if(pushA.size()!=popA.size()) return false;
        Stack<Integer> stack =new Stack<Integer> ();
        int i=0;
        for(int num :popA){
              
            if(!stack.empty()){
                if(stack.peek()==num){
                    stack.pop();
                    continue;
                }
            }
            if(i>=pushA.size()) return false;
            while(pushA.get(i++)!=num) {
                  
                if(i>=pushA.size()) return false;
                stack.push(pushA.get(i-1));
            }
                 
        }
        return true;
          
    }
}

2、
import java.util.ArrayList;
import java.util.Stack;
 
public class Solution {
    public boolean IsPopOrder(ArrayList<Integer> pushA,ArrayList<Integer> popA) {
      Stack<Integer> stack = new Stack<Integer>(); 
        boolean result = false;
        int i=0;
        int j=0;
        int n1 = pushA.size();
        int n2 = popA.size();
         
        while(j<n2)
        {
            if(i<n1 && pushA.get(i) != popA.get(j))
            {
                stack.push(pushA.get(i));
                i++;
            }else if(i<n1 && pushA.get(i) == popA.get(j))
            {
                i++;
                j++;
            }else if(stack.peek() == popA.get(j))
            {
                stack.pop();
                j++;
            }else
                break;
        }
        if(j == n2)
            result = true;
        return result;
    }
}
以上代码摘自 牛客网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值