• 剑指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 }

    运行截图:

  • 相关阅读:
    每周总结⑤
    每周总结④——所遇问题
    Leetcode566. 重塑矩阵
    移动应用开发三种方式
    html5离线存储manifest
    拓端tecdat|python中的copula:Frank、Clayton和Gumbel copula模型估计与可视化
    拓端tecdat|R语言用极大似然和梯度下降算法估计GARCH(p)过程
    拓端tecdat|R语言Keras用RNN、双向RNNs递归神经网络、LSTM分析预测温度时间序列、 IMDB电影评分情感
    JAVA中CountDownLatch的简单示例
    网络编程基础篇
  • 原文地址:https://www.cnblogs.com/vpoet/p/4675945.html
Copyright © 2020-2023  润新知