题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。java
假设压入栈的全部数字均不相等。例如序列1,2,3,4,5是某栈的压栈序列,序列,4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不多是该压栈序列的弹出序列。.net
解决这个问题很直观的想法就是创建一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依次从该栈中弹出数字。指针
以弹出序列4,5,3,2,1为例分析压栈和弹出的过程。第一个但愿 被弹出的数字是4,所以4须要先压入到辅助栈里面。压入栈的顺序由压栈序列肯定了,也就是在把4压入进栈以前,数字1,2,3都须要先压入到栈里面。此时 栈里面包含4哥数字,分别是1,2,3,4,其中4位于栈顶。把4弹出栈后,剩下的三个数字是1,2,3.接下来但愿被弹出的数字是5,因为它不是栈顶的 数字,所以咱们接着在第一个序列中巴4之后的数字压入辅助栈中,直到压入了数字5.这个时候5位于栈顶,就能够被弹出来了。接下来但愿被弹出的三个数字依 次是3,2,1.因为每次操做前他们都位于栈顶,所以直接弹出便可。下表描述了本例中入栈和出栈的过程。get
总结上述入栈、出栈的过程,咱们可疑找到判断一个序列是否是栈的弹出 顺序的规律:若是下一个弹出的数字恰好是栈顶数字,那么直接弹出。若是下一个弹出的数字不在栈顶,咱们把压栈序列中尚未入栈的数字压入辅助栈,知道把下 一个须要弹出的数字压入栈顶为止。若是全部的数字都压入栈了仍没有找到下一个弹出的数字,那么该序列不多是一个弹出序列。class
造成清晰的思路后,咱们能够些代码了,下面是Java代码的实现。import
package cglib;List
import java.util.ArrayList;
import java.util.Stack;im
public class DeleteNode {
public boolean IsPopOrder(ArrayList<Integer> pushA,ArrayList<Integer> popA) {
if(pushA.size()!=popA.size()){
return false;
}
Stack<Integer> stack = new Stack<Integer>(); //建立一个辅助的堆栈
int j=0; //定义一个指向弹出序列第一位的指针
for(int i=0;i<pushA.size();i++){
stack.push(pushA.get(i)); //对于压入序列,每一个数压入辅助栈中,每当压入一个数进行判断
while((!stack.empty())&&(stack.peek()==popA.get(j))){
stack.pop();
j++; //栈顶元素与弹出序列指针所指的数进行比较,若相同则弹栈,同时指针后移一位,直到栈顶元素与指针所指元素不一样,则压入下一个压入序列中的数
}
}
if(stack.empty()){
return true; //最终若辅助栈为空说明弹出序列为压入序列的弹出顺序。
}else{
return false;
}
}
public static void main(String[] args){
ArrayList<Integer> pushA = new ArrayList<Integer>();
pushA.add(1);
pushA.add(2);
pushA.add(3);
pushA.add(4);
pushA.add(5);
ArrayList<Integer> popA = new ArrayList<Integer>();
popA.add(4);
popA.add(5);
popA.add(3);
popA.add(2);
popA.add(1);
DeleteNode s = new DeleteNode();
boolean res = s.IsPopOrder(pushA, popA);
System.out.println(res);
}总结
输出static
true