剑指offer第二版-31栈的压入弹出序列

本文介绍了一种算法,用于判断给定的两个整数序列,其中一个序列是否为另一个序列通过栈的压入和弹出操作得到的。文章详细解释了判断流程,包括使用辅助栈来复现栈的操作,以及具体的步骤和结束条件。

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

/**
 * 栈的压入弹出序列
 * <p>
 * 输入两个整数序列,第一个序列表示栈的压入顺序,判断第二个序列是否为该栈的弹出序列。假设压入栈的所有数字均不相等。
 * 例如,压入序列为(1,2,3,4,5),序列(4,5,3,2,1)是它的弹出序列,而(4,3,5,1,2)不是。
 * <p>
 * 对于一个给定的压入序列,由于弹出的时机不同,会出现多种弹出序列。
 * 如果是选择题,依照后进先出的原则,复现一下栈的压入弹出过程就很容易判断了。
 * 写成程序同样如此,主要步骤如下:
 * <p>
 * 步骤1:栈压入序列第一个元素,弹出序列指针指弹出序列的第一个;
 * 步骤2:判断栈顶元素是否等于弹出序列的第一个元素:
 * 步骤2.1:如果不是,压入另一个元素,进行结束判断,未结束则继续执行步骤2;
 * 步骤2.2:如果是,栈弹出一个元素,弹出序列指针向后移动一位,进行结束判断,未结束则继续执行步骤2;
 * <p>
 * 结束条件:如果弹出序列指针还没到结尾但已经无元素可压入,则被测序列不是弹出序列。
 * 如果弹出序列指针以判断完最后一个元素,则被测序列是弹出序列。
 *
 * @author VicterTian
 * @version V1.0
 * @Date 2019/2/26
 */
public class P168_StackPushPopOrder {
private static boolean isPopOrder(int[] pushSeq, int[] popSeq) {
		if (pushSeq == null || popSeq == null || pushSeq.length != popSeq.length) {
			return false;
		}
		// 建立一个辅助栈
		Stack<Integer> stack = new Stack<>();
		int pushSeqIndex = 0, popSeqIndex = 0;

		while (popSeqIndex < popSeq.length) {
			// 如果辅助栈为空,或者栈顶元素不等于对应的数字,只能将对应的数字压入辅助栈中
			if (stack.isEmpty() || stack.peek() != popSeq[popSeqIndex]) {

				if (pushSeqIndex < pushSeq.length) {
					stack.push(pushSeq[pushSeqIndex++]);
				} else {
					// 如果所有元素已经完成压栈,并且栈顶元素也不是要对应的数字,那么返回false
					return false;
				}
			} else {
				// 如果辅助栈不为空,并且栈顶元素等于对应的数字,则出栈,并且popSeqIndex加一
				stack.pop();
				popSeqIndex++;
			}
		}
		return true;
	}

	public static void main(String[] args) {
		int[] push = {1, 2, 3, 4, 5};
		int[] pop1 = {4, 5, 3, 2, 1};
		int[] pop2 = {4, 3, 5, 1, 2};
		System.out.println(isPopOrder(push, pop1));
		System.out.println(isPopOrder(push, pop2));
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值