剑指offer第二版——面试题31(java)

面试题:栈的压入、弹出序列

题目:

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。

假设压入栈的所有数字均不相等

例如:序列{1,2,3,4,5}是某栈的压栈序列,序列{4,5,3,2,1}是该压栈序列对应的一个弹出序列,但{4,3,5,1,2}就不可能是该压栈序列的弹出序列

思路:

分为两个部分:压栈部分出栈比较部分

1. 根据出栈序列进行压栈部分

将压栈序列按顺序压入栈,弹出栈的顺序按弹出栈序列决定

为压栈序列和出栈序列分别设置一个loc 压栈——i 出栈——j (压栈为A 出栈为B)

当A[i] = B[j] 时,可视为压入该数字后直接弹出,即可直接i++,j++

当A[i]!=B[j]时,有两种情况:①当前栈中,栈顶元素不为需要弹出的B[j]——压入当前A[i];②当前栈中,栈顶元素为需要弹出的B[j]——弹出栈中元素,i保持原地,j++

2. 出栈比较

当压栈部分结束后,栈中剩余的应是出栈序列中的顺序排列的数,进行比较,如果顺序不同,则表示不为所对应的栈弹出顺序

eg:

1. 入栈部分

入栈顺序 1,2,3,4,5

出栈顺序 2,1,5,4,3

i=0,j=0 ——此时入栈为1,出栈为2,栈为空,所以压入1,i++

i=1,j=0 ——此时入栈为2,出栈为2,栈不为空,但两数相同,则直接忽略,i++,j++

i=2,j=1——此时入栈为3,出栈为1,栈不为空,两数不同,但栈顶元素为出栈元素相同,所以栈中pop1,j++

i=2,j=2——此时入栈为3,出栈为5,栈不同,两数不同,栈顶元素与出栈元素不同,压入栈,并i++,同理压入下一个元素4

i=4,j=2——此时入栈为5,出栈为5,两数相同,忽略,i++,j++

此时栈中从底到顶为3 4

2. 比较部分

从j位置开始比较,

j=3,出栈为4,pop出4——符合,j++

j=4,出栈为3,pop出3——符合,j++(边界,跳出)

得出结论为符合

若出栈顺序使2,1,5,3,4,在比较部分,pop4但出栈为3,就不会符合

【注意】i的++由for循环实现,但需要注意在栈顶元素为出栈元素相同时,由于i需要不改变位置,但for默认一轮次+1,所以需要对i--

public class Q31 {
	public static void main(String[] args) {
		int[] A = new int[] {1,2,3,4,5};
		int[] B = new int[] {5,1,2,4,3};
		
		boolean result = isPopList(A,B);
		System.out.println(result);
		
	}
	
	public static boolean isPopList(int[] A,int[] B) {
		// 长度不同
		if(A.length != B.length) {
			System.out.println("different length!");
			return false;
		}
		
		// 为空
		if(A.length==0 && B.length==0) {
			System.out.println("null list!");
			return false;
		}
		
		Stack sta = new Stack();
		int j=0;
		for(int i =0;i

 

 

你可能感兴趣的:(剑指offer第二版)