importjava.util.Stack;
public class Q22 {
/**
* 题目:栈的压入、弹出序列
* 题目说明:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
* 测试用例:压栈序列line1为1,2,3,4,5,序列line2:4,5,3,2,1是该栈的一个弹出序列。4,3,5,1,2不是该站的弹出序列。
* 解题思路:分为以下三种情况来处理:
* 1)当前栈顶的元素恰好等于序列line2的元素,则出栈;
* 2)压栈序列已经全部进栈,所有元素都不等于栈顶的元素,则说明该序列不是出栈顺序;返回值为false。
* 3)压栈序列没有全部进栈,则遍历剩余的压栈元素,直到压栈序列中的某个值等于line2中的元素则结束循环。
*/
public static void main(String[] args) {
int[] line1 = {1,2,3,4,5};
int[] line2 = {4,5,3,2,1};
int[] line3 = {4,3,5,1,2};
Q22 test = new Q22();
System.err.println(test.isPopOrder(line1, line2));
}
public boolean isPopOrder(int[] line1, int[] line2){
//判断两个顺序的合法性
if(line1 == null || line2 == null){
return false;
}
int point = 0;//用来指向压栈元素的标识
Stack<Integer> stack = new Stack<Integer>();
for(int i = 0; i < line1.length; i++){
if(!stack.isEmpty() && stack.peek() ==line2[i]){//1)栈顶元素等于line2的元素,则出栈
stack.pop();
}else{
if(point == line1.length){//line1中的元素都已遍历完
return false;
}else{//否则,遍历line1中剩余的元素,将其入栈
do {
stack.push(line1[point++]);
} while (point != line1.length && stack.peek() != line2[i]);
if(stack.peek() == line2[i])//如果栈顶元素等于序列line2的元素,则出栈,直到遍历完所有元素。
stack.pop();
else
return false;
}
}
}
return true;
}
}