《剑指Offer》(31)栈的压入、弹出序列

本文介绍了一种使用ArrayList模拟栈操作的算法,用于判断给定的两个整数序列是否符合栈的压入和弹出顺序。通过创建辅助栈并对比序列元素,实现对序列合法性的验证。

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

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序,假设压入栈的所有数字不相等,且压入序列和弹出序列的长度相等。

通过ArrayList类来模拟堆栈工作原理,其中ArrayList类的常用方法如下:

返回值类型方法
booleanadd(E e):将指定元素添加到集合的尾部
Eremove(int index ):移除此集合中指定位置上元素,并返回被删除的元素
Eget(E e):获取此集合中指定位置上的元素,并返回获取的元素
intsize():返回集合中的元素数
booleancontains(Object obj):判断集合中是否包含指定元素
Eset(int index,String element):把集合中指定位置上的元素改为新元素

Java代码如下:

import java.util.ArrayList;
public class Solution 
{
    public boolean IsPopOrder(int [] pushA,int [] popA) 
    {
        boolean isPopOrder = false;
        if(pushA != null && popA != null)
        {
            int length = pushA.length;//(注意:这两个序列的长度是相等的)
            int pushIndex = 0;
            int popIndex = 0;
            ArrayList<Integer> al = new ArrayList<Integer>();//辅助栈
            while(popIndex < length)
            {
                //向辅助栈中添加元素(当辅助栈中没有元素时,)
                while(al.size() == 0 || al.get(al.size() - 1) != popA[popIndex])//返回此集合中指定位置上的元素,并返回获取的元素。
                {
                    if(pushIndex == length)
                        break;
                    al.add(pushA[pushIndex]);
                    pushIndex++;
                }
                if(al.get(al.size() - 1) != popA[popIndex])
                    break;
                //弹出辅助栈顶部的元素(当辅助栈顶部的元素和弹出序列中下一个需要弹出的数字相等时)
                al.remove(al.size() - 1);//移除此集合中指定位置上的元素,并返回被删除的元素。
                popIndex++;
            }
            if(al.size() == 0 && popIndex == length)
                isPopOrder = true;
        }
        return isPopOrder;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值