
假设压入栈的所有数字均不相等。 例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列, 但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路 根据出栈顺序模拟一次入栈
入栈元素 等于出栈顺序第一个时就 该元素就可以出栈了
思路 根据出栈顺序模拟一次入栈
入栈元素 等于出栈顺序第一个时就 该元素就可以出栈了
比如 入12345 出栈顺序45321
入1 出栈顺序第一个是4嘛 说明只有入到4才会出啊 -》
4
3
2
1 -》入到4了 相等那就出-》
3
2
1继续正常入
5
3
2
1 5对上了5321那就出啊
-》3
2
1
如此循环下去 只要入栈又全出那就说明顺序是对的
然后呢我踩了3个坑
1java.lang.ArrayIndexOutOfBoundsException(数组越界)处理
2Exception in thread "main" java.util.EmptyStackException
3if判断不周全 该用while的
import java.util.ArrayList;
import java.util.Stack;
/*
输入两个整数序列,第一个序列表示栈的压入顺序,
请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,
但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
思路 根据出栈顺序模拟一次入栈
入栈元素 等于出栈顺序第一个时就 该元素就可以出栈了
比如 入12345 出栈顺序45321
入1 出栈顺序第一个是4嘛 说明只有入到4才会出啊 -》
4
3
2
1 -》入到4了 相等那就出-》
3
2
1继续正常入
5
3
2
1 5对上了5321那就出啊
-》3
2
1
如此循环下去 只要入栈又全出那就说明顺序是对的
然后呢我踩了3个坑
1java.lang.ArrayIndexOutOfBoundsException(数组越界)处理
2Exception in thread "main" java.util.EmptyStackException
3if判断不周全 该用while的
*/
public class t21 {
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
int length = popA.length;
Stack<Integer> sta = new Stack<>();
int i=0,j=0;
while (i<length){ // 1java.lang.ArrayIndexOutOfBoundsException(数组越界)处理 不应该是<=的
sta.push(pushA[i]);
while (!sta.isEmpty() && sta.peek()==popA[j]){ //这个while循环原本只写了一个if判断 导致他只判断了一次就结束了 但是有可能会出栈几个元素的所以错了
//这里应该再加一个判断条件 就是栈不能为空 或者控制 j(出栈)的总次数不能多于length j<lengthj从0开始的{j < len&& sta.peek()==popA[j]} 否则他就会循环多次但是栈是null 就会报错
j++;
sta.pop();
}
i++;
}
return sta.isEmpty();
}
}
}