栈的压入、弹出序列

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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 }

 

posted on 2016-06-21 16:50  wxdjss  阅读(187)  评论(0编辑  收藏  举报

导航