栈的压入弹出序列

Posted wxdjss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈的压入弹出序列相关的知识,希望对你有一定的参考价值。

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
 
 解题思路:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止。如果所有的数字都压入栈仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。
 
 1 bool IsPopOrder(const int* pPush,const int* pPop,int nLength)
 2 {
 3  bool bPossible=false;
 4  if(pPush!=NULL&&pPop!=NULL&&nLength>0)
 5  {
 6   const int* pNextPush=pPush;
 7   const int* pNextPop=pPop;
 8   std::stack<int> stackData;
 9    
10  while(pNextPop-pPop<nLength)
11  {
12    while(stackData.empty()||stackData.top()!=*pNextPop)
13    {
14        if(pNextPush-pPush==nLength)
15        break;
16        stackData.push(*pNextPush);
17        pNextPush++;
18    }
19    if(stackData.top()!=*pNextPop)
20    break;
21   
22   stackData.pop();
23   pNextPop++;
24 }
25  if(stackData.empty()&&pNextpop-pPop==nLength)
26  bPossible=true;
27 }
28 return bPossible;
29 }

 

以上是关于栈的压入弹出序列的主要内容,如果未能解决你的问题,请参考以下文章

Offer[31] 栈的压入弹出序列

剑指offer 栈的压入弹出序列

剑指offer 栈的压入弹出序列

剑指offer--31栈的压入弹出序列

剑指offer--31栈的压入弹出序列

算法:栈的压入弹出序列