zoukankan      html  css  js  c++  java
  • 剑指offer-面试题22.栈的压入,弹出序列

    题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第

    二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。

    例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1

    是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该

    该压栈序列的弹出序列。

    这种判断其实只要掌握栈的先进后出原则,则不难解决。

    本题的题解步骤如下:

    1.设置一个辅助栈S,用于模拟出栈入栈顺序,设入栈顺序序列为pPush,出栈顺序序列为pPop

    2.设置两个索引或指针分别指向入栈序列和出栈序列的第一个元素

    3.顺序索引入栈元素,当入栈元素不等于出栈元素的时候,将入栈元素依次压入辅助栈S

    4.当两者相等的时候,压入该元素到辅助栈S中同时将栈顶元素出栈,出栈入栈序列的索引均向后移动一个位置

    5.当入栈序列索引结束之后,pPush剩余的元素全部已压入栈S

    6.依次索引pPop如果pPop与辅助栈顶元素比较如果相等这将辅助栈顶弹出

    7.当栈中所有的元素均弹出的时候则说明出栈顺序序列与正好是入栈顺序序列对应的出栈顺序。否则出栈顺序与入栈顺序不匹配。

    代码实现如下:

     1 #include <iostream>
     2 #include <stack>
     3 using namespace std;
     4 
     5 bool IsPopOrder(const int* pPush,const int* pPop,int nLength)
     6 {
     7     stack<int> S;
     8     int p1=0,p2=0;
     9 
    10     while(p1<nLength)
    11     {
    12 
    13         if(pPush[p1]!=pPop[p2])
    14         {
    15             S.push(pPush[p1]);
    16             p1++;
    17         }
    18         else
    19         {
    20             S.push(pPush[p1]);
    21             S.pop();
    22             p1++;
    23             p2++;
    24         }
    25     
    26     }
    27 
    28     while(p2<nLength)
    29     {
    30         if(pPop[p2]==S.top())
    31         {
    32             S.pop();
    33             p2++;
    34         }
    35         else
    36         {
    37             return false;
    38         }
    39     }
    40 
    41     return true;
    42 }
    43 
    44 int main()
    45 {
    46     int pPush[5]={1,2,3,4,5};
    47     int pPop[5];
    48     int len=5;
    49 
    50     cout<<"Please input the sequence of Out stack:
    ";
    51     for(int i=0;i<len;i++)
    52     {
    53         int data=0;
    54         cin>>data;
    55         pPop[i]=data;
    56 
    57     }
    58 
    59     if(IsPopOrder(pPush,pPop,len))
    60     {
    61         cout<<"The out sequence is right."<<endl;
    62     }
    63     else
    64     {
    65         cout<<"The out sequence is wrong."<<endl;
    66     }
    67 
    68     return 0;
    69 }

    运行截图:

  • 相关阅读:
    python作业堡垒机(第十三周)
    Python的一个BOX
    Nginx (限速)限制并发、限制访问速率、限制流量
    Nginx反向代理维基百科镜像制作全解析
    防盗链测试01
    Pycharm和IntelliJ IDEA激活 2017.3.x版本
    [Openwrt 扩展下篇] Openwrt搭建私有云Owncloud 9
    [Openwrt扩展中篇]添加Aria2和webui
    [Openwrt 扩展上篇]USB挂载&U盘启动&Samba共享
    python作业(第十一周)基于RabbitMQ rpc实现的主机管理
  • 原文地址:https://www.cnblogs.com/vpoet/p/4675945.html
Copyright © 2011-2022 走看看