栈的压入弹出序列:给定两个序列,一个是压入顺序,判断另外一个是否是该压入顺序的一个弹出顺序
思路:纯粹的模拟栈的压入和弹出顺序
分别遍历压栈序列seq1和另一个序列seq2
比较当前栈顶元素和seq2的当前值
如果相等,那么弹出,seq2的指针下移
如果不等,那么依次压入seq1中的元素直到遇到栈顶等于当前seq2指针所知元素
如果上述遍历中将seq1中所有数据都压入栈之后,仍未找到seq2当前元素,那么失败
如果遍历完,两个序列的指针都到达末尾,那么成功
public class _Q22 {
public boolean IsPopOrder(int seq1[], int seq2[]){
if(seq1 == null) return false;
if(seq2 == null) return false;
// 此处应该抛出异常提示调用者
if(seq1.length != seq2.length) return false;
boolean result = true;
Stack<Integer> stack = new Stack<>();
int seq1Index = 0;
stack.push(seq1[seq1Index++]);
for (int i = 0; i < seq2.length;) {
if (seq2[i] == stack.peek()) {
i++;
stack.pop();
} else {
if (seq1Index < seq1.length) {
stack.push(seq1[seq1Index++]);
}else{
result = false;
break;
}
}
}
return result;
}
}
测试代码:
public class _Q22Test extends TestCase {
_Q22 popOrder = new _Q22();
public void test(){
int seq1[] = {1, 2, 3, 4, 5};
int seq2[] = {4, 5, 3, 2, 1};
int seq3[] = {4, 3, 5, 1, 2};
int seq4[] = {5};
System.out.println(popOrder.IsPopOrder(seq1, seq2));
System.out.println(popOrder.IsPopOrder(seq1, seq3));
System.out.println(popOrder.IsPopOrder(seq4, seq4));
System.out.println(popOrder.IsPopOrder(null, null));
}
}版权声明:本文为Sugar_Z_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。