剑指Offer 面试题31:栈的压入、弹出序列 Java代码实现

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

解题思路:判断一个序列是不是栈的弹出顺序的规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助栈,知道把下一个需要弹出的数字压入栈顶为止。如果所有的数字都压入栈了仍没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。

具体代码如下:

public boolean isPopOrder(int[] pushArr,int[] popArr){
		if(pushArr.length==0||popArr.length==0)
			return false;
		//借用一个辅助栈 遍历入栈数组,一个个入栈
		//每次入栈,都需要检查:如果发现栈顶数字是弹出数组中的数字 那么直接弹出,并且弹出数组位置下移一位
		//循环完毕,如果栈内还有数字,则序列不对
		Stack<Integer> s=new Stack<>();
		
		//标识弹出序列位置
		int popIndex=0;
		for(int i=0;i<pushArr.length;i++){
			s.push(pushArr[i]);
			while(!s.isEmpty()&&s.peek()==popArr[popIndex]){
				//出栈
				s.pop();
				//弹出序列后移一位
				popIndex++;
			}
		}
		
		return s.empty();
	}
测试代码和结果:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr1={1,2,3,4,5};
		int[] arr2={4,5,3,2,1};
		int [] arr3={4,3,5,1,2};
		Problem31 p=new Problem31();
		System.out.println(p.isPopOrder(arr1, arr2));
		System.out.println(p.isPopOrder(arr1, arr3));
	}
true
false


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值