算法题解3_栈的压入弹出序列

输入两个整数数列,第一个序列表示栈的压入顺序,判断第二个序列是否为该栈的弹出序列。假设压入栈的所有元素均不等。 如序列 1,2,3,4,5是压入序列,则4,5,3,2,1可以是弹出序列,但是4,3,5,1,2就不能是弹出序列

解法

设定一个辅助栈,两个变量nextPop和nextPush分别指向弹出序列和压入序列的当前元素。如果nextPop指向的元素和栈顶元素一样,直接弹出;如果不等,把nextPush指向的和后面的元素压入栈,直到栈顶元素和nextPop指向元素相等。

代码如下:

public static boolean isPopPossible(int[] pushOrder, int[] popOrder) {
	
	boolean possible = false;
	
	if ( pushOrder == null || popOrder == null || pushOrder.length != popOrder.length )
		return false;
	
	int next_pop = 0;
	int next_push = 0;
	
	Stack<Integer> dataStack = new Stack<Integer>();
	
	while ( next_pop < popOrder.length ) {
		
		while ( dataStack.empty() || dataStack.peek() != popOrder[next_pop] ) {
			
			if ( pushOrder.length == next_push )
				break;
			
			dataStack.push( pushOrder[next_push++] );
		}
		
		if ( dataStack.peek() != popOrder[next_pop] )
			break;
		
		dataStack.pop();
		next_pop++;
		
	}
	
	if ( dataStack.empty() && next_pop == popOrder.length )
		possible = true;
	
	return possible;
}
Written on January 7, 2016