zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Oracle SQL语句大全—查看表空间
    Class to disable copy and assign constructor
    在moss上自己总结了点小经验。。高手可以飘过 转贴
    在MOSS中直接嵌入ASP.NET Page zt
    Project Web Access 2007自定义FORM验证登录实现 zt
    SharePoint Portal Server 2003 中的单一登录 zt
    vs2008 开发 MOSS 顺序工作流
    VS2008开发MOSS工作流几个需要注意的地方
    向MOSS页面中添加服务器端代码的另外一种方式 zt
    状态机工作流的 SpecialPermissions
  • 原文地址:https://www.cnblogs.com/zle1992/p/7835081.html
Copyright © 2011-2022 走看看