剑指offer面试题22 栈的压入弹出序列

考察点

辅助栈

知识点

题目

分析
这道题目要求输入俩个序列,第一个序列表示栈的压入顺序,要求判断第二个序列是否是该栈的弹出顺序。遇到这类题目思维一定要往辅助栈上靠,因为关于栈的考点其实就是这个。这种题目的解题思路就是归纳,通过举例寻找数字之间的规律。可以思考一下什么情况下能说明不是呢?当我们拿第二个序列的某个元素,去第一个序列里面找结果没找到,这肯定能说明答案就是不是,所以我们只需要正常遍历第二个序列的数据,依次去看这个数据是否存在于第一个序列中,这个过程也需要遍历第一个序列的数据,如果遍历完了发现不存在那就可以证明不是,由于栈具有先入后出的特点,所以在遍历第一个序列的时候一直到找到指定数据前面的数据都需要先入栈,到这一步就引出了我们的算法需要考虑的另外一个点,遍历第一个序列之前需要先判断栈顶的数据是否是正要找的那个数据,如果不是才需要再去遍历第二个序列。

import java.util.Deque;
import java.util.LinkedList;

public class TwentyTwo {
	public static void main(String[] args) {
		int arr[] = {1,2,3,4,5};
		int brr[] = {4,5,3,2,1};
		System.out.println(isRank(arr,brr));
		int crr[] = {4,3,5,1,2};
		System.out.println(isRank(arr,crr));
		int drr[] = {4,3,5,1,22};
		System.out.println(isRank(arr,drr));
	}
	public static boolean isRank(int[] arr,int[] brr) {
		if (arr.length != brr.length || arr.length <= 0 || brr.length <= 0) {
			return false;
		}
		Deque stack = new LinkedList<>();
		int arrIndex = 0;
		for (int i = 0;i<brr.length;i++) {
			if (stack.peek() == null || (int) stack.peek() != brr[i]) {
				boolean tag = false;
				//这里arrIndex的意思是需要接着序列1上次的位置开始遍历
				for (int j = arrIndex;j < arr.length;j++,arrIndex++) {
					if (arr[j] != brr[i]) {
						stack.push((int) arr[j]);
					} else {
						tag = true;
					}
				}
				if (!tag) {
					return false;
				}
			} else {
				stack.pop();
			}
		}
		if (stack.size() > 0) {
			return false;
		}
		return true;
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值