Q:给定一个入栈序列in和出栈序列out,判断out是否是in的一个可行(合法)的出栈序列。
思路:将入栈序列in入栈,若当前栈顶的元素与当前out的元素相同,那么继续判断out的下一个元素。
若当前栈顶的元素与当前out的元素不同,且还有未入栈的in元素,那么继续入栈新元素,否则
就表明,所有的入栈in元素都入栈了,该出栈的元素就是没在栈顶出现,说明被“埋没”了,是个错误的出栈顺序。
bool IsPopOrdder(const int *pPush, const int *pPop, int nlength)
{
stack<int> stackData;
bool bPossible = false;
const int maxvalue = 0x7fffffff;
stackData.push(maxvalue);
const int *pcPop = pPop;
const int *pcPush = pPush;
if(NULL != pcPop && NULL != pcPush && nlength > 0)
{
while (1)
{
//相同,则pop
if(stackData.top() == *pcPop)
{
stackData.pop();
++pcPop;
}
//否则判断下一个入栈的值的情况,这里会有两种情况:
//1)没有元素可以入栈,那么就停止。
else if(pcPush - pPush == nlength)
break;
//2)有元素可以入栈,就继续
else
{
stackData.push(*pcPush);
++pcPush;
}
}
//表示该入栈的都入了,判断该出的是否都出了。
if(stackData.top() == maxvalue)
bPossible = true;
}
return bPossible;
}