栈的压入、弹出序列-剑指offer(java版)

来源:互联网 发布:金蝶软件建账流程 编辑:程序博客网 时间:2024/05/29 08:13

问题描述在程序注释中体现,主要思想是:创建一个辅助的堆栈,定义一个指向弹出序列第一位的指针,对于压入序列,每个数压入辅助栈中,每当压入一个数进行判断:栈顶元素与弹出序列指针所指的数进行比较,若相同则弹栈,同时指针后移一位,直到栈顶元素与指针所指元素不同,则压入下一个压入序列中的数。最终若辅助栈为空说明弹出序列为压入序列的弹出顺序。具体程序如下:

/*问题:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。 *例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹 *出序列。*/import java.util.ArrayList;import java.util.Stack;public class Solution12 {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);Solution12 s = new Solution12();boolean res = s.IsPopOrder(pushA, popA);System.out.println(res);}}
主函数中按照问题的例子验证了一下,结果为true

1 0