【剑指Offer】21、栈的压入、弹出序列
作者:互联网
题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
解题思路:
本题很直观的一个想法就是建立一个辅助栈,用该栈根据给出的序列来模拟压栈、弹栈动作,进而判断该序列是否可能正确。解决这样的问题一般不太好分析,可以通过几个具体的实例,使问题具体化,进而发现普遍规律。
以以下两个例子为例,我们可以找到判断一个序列是不是栈的弹出序列的规律:根据弹出序列,我们依次进行判断,如果下一个要弹出的数字刚好是栈顶数字,那么直接弹出;如果下一个要弹出的数字不在栈顶,则把压栈序列中还没有入栈的数字压入栈中,直到将下一个要弹出的数字压入栈顶为止,如果所有的数字都压入栈中后仍然没有找到下一个要弹出的数字,那么该序列就不可能是一个弹出序列。
举例:
编程实现(Java):
public boolean IsPopOrder(int [] pushA,int [] popA) {
if(pushA==null || popA==null)
return false;
Stack<Integer> stack=new Stack<>(); //辅助栈,用来模拟该过程
int p=0; //进栈序列下标
for(int i=0;i<popA.length;i++){
//当前需要弹出的是popA[i]
if(!stack.empty()&& stack.peek()==popA[i]) //弹出的元素正好是栈顶元素
stack.pop();
else{
while(stack.empty() || stack.peek()!=popA[i]){ //下一个弹出的数字不是栈顶元素
if(p>=pushA.length) //所有数字都压入栈中还没有找到弹出元素,则说明不是一个弹出序列
return false;
stack.push(pushA[p]);
p++;
}
stack.pop(); //从while循环出来,一定满足相等,否则在内部直接return
}
}
return true;
}
标签:return,数字,压入,Offer,int,pushA,序列,21 来源: https://www.cnblogs.com/gzshan/p/10789722.html