程序员面试题精选100题(24)-栈的push、pop序列[数据结构]

题目:输入两个整数序列。其中一个序列表示栈的 push 顺序,判断另一个序列有没有可能是对应的 pop 顺序。为了简单起见,我们假设 push 序列的任意两个整数都是不相等的。

比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,这样得到的pop序列就是4、5、3、2、1。但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。

分析:这到题除了考查对栈这一基本数据结构的理解,还能考查我们的分析能力。

这道题的一个很直观的想法就是建立一个辅助栈,每次push的时候就把一个整数push进入这个辅助栈,同样需要pop的时候就把该栈的栈顶整数pop出来。

我们以前面的序列4、5、3、2、1为例。第一个希望被pop出来的数字是4,因此4需要先push到栈里面。由于push的顺序已经由push序列确定了,也就是在把4 push进栈之前,数字1,2,3都需要push到栈里面。此时栈里的包含4个数字,分别是1,2,3,4,其中4位于栈顶。把4 pop出栈后,剩下三个数字1,2,3。接下来希望被pop的是5,由于仍然不是栈顶数字,我们接着在push序列中4以后的数字中寻找。找到数字5后再一次push进栈,这个时候5就是位于栈顶,可以被pop出来。接下来希望被pop的三个数字是3,2,1。每次操作前都位于栈顶,直接pop即可。

再来看序列4、3、5、1、2。pop数字4的情况和前面一样。把4 pop出来之后,3位于栈顶,直接pop。接下来希望pop的数字是5,由于5不是栈顶数字,我们到push序列中没有被push进栈的数字中去搜索该数字,幸运的时候能够找到5,于是把5 push进入栈。此时pop 5之后,栈内包含两个数字1、2,其中2位于栈顶。这个时候希望pop的数字是1,由于不是栈顶数字,我们需要到push序列中还没有被push进栈的数字中去搜索该数字。但此时push序列中所有数字都已被push进入栈,因此该序列不可能是一个pop序列。

也就是说,如果我们希望pop的数字正好是栈顶数字,直接pop出栈即可;如果希望pop的数字目前不在栈顶,我们就到push序列中还没有被push到栈里的数字中去搜索这个数字,并把在它之前的所有数字都push进栈。如果所有的数字都被push进栈仍然没有找到这个数字,表明该序列不可能是一个pop序列。

基于前面的分析,我们可以写出如下的参考代码:

#include <stack>

/
// Given a push order of a stack, determine whether an array is possible to 
// be its corresponding pop order
// Input: pPush   - an array of integers, the push order
//        pPop    - an array of integers, the pop order
//        nLength - the length of pPush and pPop
// Output: If pPop is possible to be the pop order of pPush, return true.
//         Otherwise return false
/
bool IsPossiblePopOrder(const int* pPush, const int* pPop, int nLength)
{
      bool bPossible = false;

if(pPush && pPop && nLength > 0)
      {
            const int *pNextPush = pPush;
            const int *pNextPop = pPop;

// ancillary stack
            std::stack<int> stackData;

// check every integers in pPop
            while(pNextPop - pPop < nLength)
            {
                  // while the top of the ancillary stack is not the integer 
                  // to be poped, try to push some integers into the stack
                  while(stackData.empty() || stackData.top() != *pNextPop)
                  {
                        // pNextPush == NULL means all integers have been 
                        // pushed into the stack, can't push any longer
                        if(!pNextPush)
                              break;

stackData.push(*pNextPush);

// if there are integers left in pPush, move 
                        // pNextPush forward, otherwise set it to be NULL
                        if(pNextPush - pPush < nLength - 1)
                              pNextPush ++;
                        else
                              pNextPush = NULL;
                  }

// After pushing, the top of stack is still not same as 
                  // pPextPop, pPextPop is not in a pop sequence
                  // corresponding to pPush
                  if(stackData.top() != *pNextPop)
                        break;

// Check the next integer in pPop
                  stackData.pop();
                  pNextPop ++;
            }

// if all integers in pPop have been check successfully, 
            // pPop is a pop sequence corresponding to pPush 
            if(stackData.empty() && pNextPop - pPop == nLength)
                  bPossible = true;
      }

return bPossible;
}

本文已经收录到《剑指Offer——名企面试官精讲典型编程题》一书中,有改动,书中的分析讲解更加详细。欢迎关注。

本题已被九度Online Judge系统收录,欢迎读者移步到http://ac.jobdu.com/hhtproblems.php在线测试自己的代码。

博主何海涛对本博客文章享有版权。网络转载请注明出处http://zhedahht.blog.163.com/。整理出版物请和作者联系。

栈的push、pop序列-判断序列是否是栈的pop顺序相关推荐

  1. 输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。

    题目:输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2.3 ...

  2. 栈的push、pop序列

    题目:输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2.3 ...

  3. PAT甲级1051 Pop Sequence:[C++题解]模拟栈、判断序列是否是合法的出栈序列

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 题意:将1~N压栈,判断给定序列是否是合法的出栈序列. 对于序列1~N中的每个值i,先将其压入栈.然后对于它就有两种处理方法:要么压 ...

  4. 程序员面试题精选100题(24)-栈的push、pop序列[数据结构]

    题目:输入两个整数序列.其中一个序列表示栈的 push 顺序,判断另一个序列有没有可能是对应的 pop 顺序.为了简单起见,我们假设 push 序列的任意两个整数都是不相等的. 比如输入的push序列 ...

  5. 29. 栈的push,pop序列

    题目:给定2个整数序列,其中1个是栈的push顺序,判断另一个有没有可能是对应的pop顺序 解:其实这题主要是判断进栈次数和出栈次数誓不是相等.我是用栈作的,效率不高,每一个元素最多出栈1次,进栈1此 ...

  6. 【栈和队列】栈的push、pop序列

    题目:输入两个整数序列.其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序.假设压入栈的所有数字均不相等. 方法一:使用栈模拟 bool popIsPushOrder(in ...

  7. 程序员面试题精选(24):栈的push、pop序列

    题目:输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2.3 ...

  8. 栈的push,pop序列

    题目:输入两个整数序列.其中一个序列表示栈的push 顺序, 判断另一个序列有没有可能是对应的pop 顺序. 思路:首先新建一个栈.从push序列开始遍历,如果当前元素与pop序列当前元素相等,则两个 ...

  9. 栈的push、pop 序列

    栈的push.pop 序列 题目:输入两个整数序列.其中一个序列表示栈的push 顺序, 判断另一个序列有没有可能是对应的pop 顺序. 为了简单起见,我们假设push 序列的任意两个整数都是不相等的 ...

最新文章

  1. log4j个人使用整理
  2. 初识C语言---(1)
  3. 优雅地处理重复请求(并发请求)
  4. java正则表达式逗号_正则表达式只匹配逗号而不是括号?
  5. 物理内存和虚拟内存的区别 及 什么是虚拟地址空间
  6. 烟台大学计算机学院老师,王鹏-烟台大学计算机与控制工程学院
  7. PyQt5-菜单栏工具栏状态栏的使用(QMenuBar、QToolBar、QStatusBar)
  8. 【EPS精品教程】基于DOM和DSM创建垂直模型、加载垂直模型
  9. Twitter4j和Esper:在Twitter上跟踪用户情绪
  10. MVC web api 返回JSON的几种方式,Newtonsoft.Json序列化日期时间去T的几种方式
  11. RedHat未注册 无法使用yum的解决办法
  12. 云智慧完成D3轮6000万美元融资,继续领跑智能运维市场
  13. typeof, offsetof, container_of宏
  14. CPU 100% 异常排查实践与总结
  15. SPSS怎么筛选无效数据
  16. 单位圆盘的全纯自同构群Aut B(0,1)
  17. 网页另存为html有的图片无法显示,网页图片不能另存为怎么回事?网页上找到的图片不能另存的解决方法...
  18. linux实现文件共享的方式,Linux文件共享的实现方式
  19. unity3d发布安卓出错plese set the package name
  20. 房屋出租系统(第一版)

热门文章

  1. 从零开始学USB(一、基础知识1)
  2. MATLAB阶段性方程组,[转载]matlab 解方程组
  3. @Vaild注解使用详解
  4. aiml的中文适配aiml_cn
  5. ARCGIS绘制南海图框
  6. RT-thread应用讲解——FLASH分区
  7. html根据ip和mac地址,关于怎么通过IE浏览器获取客户端的IP地址和Mac地址
  8. 联想笔记本无线网络无法使用(无线开关已打开,但搜不到无线网络)
  9. 移动开发唱衰,iOS开发者如何涅槃重生?
  10. 移动,相机控制与碰撞