题目描述:输入两个整数序列。第一个序列表示栈的压入顺序,判断第二个序列是否为表示栈的出栈序列。
例如:入栈序列:1,2,3,4,5。序列:4,5,3,2,1可认为是入栈队列的出栈队列。
bool IsPopOrder(const int* pPush,const int* pPop,int length)
{
bool ispossible=false;
//入栈序列、出栈序列和长度不能为空
if(pPush!=NULL&&pPop!=NULL&&length>0)
{
const int* pNextPush=pPush;
const int* pNextPop=pPop;
stack<int> stackdata;//构建辅助栈
//出栈序列的元素未遍历完
while(pNextPop-pPop<length)
{
//循环条件:辅助栈顶元素与出栈序列值不相等,并且辅助栈为空
while(stackdata.empty()||*pNextPop!=stackdata.top())
{
stackdata.push(*pNextPush);
++pNextPush;
if(pNextPush-pPush==length)
break;
}
//栈顶元素不等于出栈序列值
if(stackdata.top()!=*pNextPop)
break;
stackdata.pop();
++pNextPop;
}
//完全遍历出栈序列,且辅助栈为空
if(pNextPop-pPop==length&&stackdata.empty())
ispossible=true;
}
return ispossible;
}