面试题22:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
分析:
考研的数据结构中也常有这种题目,解题的基本思路是:如果要得到第二序列中的第一元素需要将那么些元素入栈,然后出栈得到第一个元素,然后判断第二元素是不是在栈顶若不是继续入栈直到序列为空或者得到该元素。文字表达比较绕,画图表示:
假设入栈序列为:1.2.3.4.5需要得到的出栈序列为:4.3.5.1.2
为了得到4那么需要将1.2.3.4入栈,然后4出栈。得到4,然后第二个出栈序列的元素为3,正好位于栈顶,于是出栈,下一个出栈元素为5,于是5入栈、出栈。得到5,下一个是1,此时栈顶元素是2且出栈序列为空,此时结束表示出栈序列不是该栈的弹出顺序。
pPush为入栈序列,pPop为出栈序列,nLength为栈的深度
bool IsPopOrder(const int* pPush,const int* pPop,int nLength)
{
bool bPossible = false;
if(pPush != NULL && pPop != NULL && nLength>0)
{
const int* pNextPush = pPush();
const int* pNextPop = pPop();
std::stack<int>stackData;
while(pNextPop - pPop < nLength)
{
while(stackData.empty() || stackData.top() != *pNextPop)
{
if(pNextPush - pPush == nLength){
break;
}//入栈序列全部遍历
stackData.push(*pNextPush);
pNextPush ++ ;
}
if(stackData.top() != *pNextPop)
{
break;
}
stackData.pop();
pNextPop++;
}
if(stackData.empty() && pNextPop - pPop == nLength)
{
bPossible = true;
}//出栈序列全部遍历
}
return bPossible;
}