21栈的压入、弹出序列
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
思路:
建立辅助栈
例如12345 是压栈顺序,45321是出栈顺序。 第一个被弹出的数字是4,所以根据压栈顺序12345,把1234压入辅助栈
此时把辅助栈里的4弹出,辅助栈的栈顶是3 不等于5,继续把压栈顺序里的5压入辅助栈,此时辅助栈顶元素是5,与出栈顺序的第二个元素相等,弹出辅助栈的5,此时栈顶是3,与出栈顺序的3相等,辅助栈弹出3,依次类推,最后辅助栈为空,说明45321是出栈顺序。
例如12345 是压栈顺序,43512是出栈顺序。 第一个被弹出的数字是4,所以根据压栈顺序12345,把1234压入辅助栈
此时把辅助栈里的4弹出,辅助栈的栈顶是3 等于出栈顺序的第二个元素,把辅助栈的3弹出,此时栈顶是2,2不等于5,把压栈顺序里的5压入辅助栈,此时辅助栈顶是5,与出栈顺序第三个相等弹出5.此时辅助栈顶是2,2不等于出栈顺序第4个元素1,继续压栈,但是压栈顺序为空了,辅助栈也没变空,说明43512不是出栈顺序。
总结:
如果下一个弹出的数字刚好是栈顶数字,那么直接弹出,如果下一个弹出的数字不在栈顶,直到把下一个需要弹出的数字压入栈为止。如果所有的数字懂压入栈了,还没找到下一个弹出的数字,那么这个序列不是出栈顺序。
例如12345 是压栈顺序,45321是出栈顺序。 第一个被弹出的数字是4,所以根据压栈顺序12345,把1234压入辅助栈
此时把辅助栈里的4弹出,辅助栈的栈顶是3 不等于5,继续把压栈顺序里的5压入辅助栈,此时辅助栈顶元素是5,与出栈顺序的第二个元素相等,弹出辅助栈的5,此时栈顶是3,与出栈顺序的3相等,辅助栈弹出3,依次类推,最后辅助栈为空,说明45321是出栈顺序。
例如12345 是压栈顺序,43512是出栈顺序。 第一个被弹出的数字是4,所以根据压栈顺序12345,把1234压入辅助栈
此时把辅助栈里的4弹出,辅助栈的栈顶是3 等于出栈顺序的第二个元素,把辅助栈的3弹出,此时栈顶是2,2不等于5,把压栈顺序里的5压入辅助栈,此时辅助栈顶是5,与出栈顺序第三个相等弹出5.此时辅助栈顶是2,2不等于出栈顺序第4个元素1,继续压栈,但是压栈顺序为空了,辅助栈也没变空,说明43512不是出栈顺序。
总结:
如果下一个弹出的数字刚好是栈顶数字,那么直接弹出,如果下一个弹出的数字不在栈顶,直到把下一个需要弹出的数字压入栈为止。如果所有的数字懂压入栈了,还没找到下一个弹出的数字,那么这个序列不是出栈顺序。
错误代码把 while 写成 if 了!!!!
1 import java.util.ArrayList; 2 import java.util.Stack; 3 public class Solution { 4 public boolean IsPopOrder(int [] pushA,int [] popA) { 5 Stack<Integer> s = new Stack<Integer>(); 6 int pushindex = 0; 7 int popindex = 0; 8 for(;pushindex<pushA.length;pushindex++){ 9 s.push(pushA[pushindex]); 10 while(!s.empty()&& popA[popindex] == s.peek()){ 11 s.pop(); 12 popindex++; 13 } 14 } 15 return s.empty(); 16 } 17 }