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