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不是出栈顺序。


总结:
如果下一个弹出的数字刚好是栈顶数字,那么直接弹出,如果下一个弹出的数字不在栈顶,直到把下一个需要弹出的数字压入栈为止。如果所有的数字懂压入栈了,还没找到下一个弹出的数字,那么这个序列不是出栈顺序。
 
错误代码把 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 }

 

posted @ 2017-11-14 22:21  乐乐章  阅读(319)  评论(0编辑  收藏  举报