题目描述
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
- 假设压入栈的所有数字均不相等。
- 例如序列12345是某栈的压栈序列,序列45321是该压栈序列对应的一个弹出序列,但43512就不可能是该压栈序列的弹出序列。
解析
- 栈的特点是FIFO
- 压入序列是确定的,则压入序列之间的元素可能会经历压入后马上被弹出的情况
- 具体思路为:
- 根据弹出序列的第一个值,判断在该元素之前被压入栈的所有元素.
- 栈顶元素与弹出序列第一个值进行比较,等则判断弹出序列的下一个元素,判断依据同步骤1。
- 如果所有的元素都被压入栈中,但是两者仍然不相等,说明弹出序列不可能是原序列的弹出序列。
- 这样一直判断直到弹出序列的最后一个元素。
代码实现
public boolean IsPopOrder(int [] pushA,int [] popA) {
boolean possible = false;
//存放压入栈中的元素
ArrayList<Integer> data = new ArrayList<Integer>();
if(pushA.length > 0 && popA.length > 0 && pushA.length == popA.length){
int len = pushA.length;
//第一个弹出元素位置
int pop = 0;
//下一个要弹出元素的位置
int nextPop = 0;
//第一个压入栈中的元素位置
int push = 0;
//下一个要压入栈中的元素位置
int nextPush = 0;
int index = -1;
while(nextPop - pop < len){
//如果要弹出的元素与栈顶元素不相等,就一直压栈直到相等
while(data.size() == 0 || data.get(index) != popA[nextPop]){
//当全部元素添加完毕之后,结束循环
if(nextPush - push == len){
break;
}
data.add(pushA[nextPush]);
nextPush++;
index++;
}
if(data.get(index) != popA[nextPop]){
break;
}
//移除第一个比较的元素
data.remove(index--);
//判断下一个待弹出元素
nextPop++;
}
//在集合全部元素比较完毕并且弹出序列也比较完毕
if(data.size() == 0 && nextPop - pop == len){
possible = true;
}
}
return possible;
}