元素出栈、入栈顺序的合法性。如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),则合法。入栈的序列(1,2,3,4,5),出栈序列为(4,5,2,3,1),则不合法。
bool IsPopOrder(const int* pPush, const int* pPop, int nLength) //三个参数:压入序列,弹出序列,序列长度
{
bool bProssible = 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) //数据栈为空并且已经全部压入,说明弹出序列匹配
bProssible = true;
}
return bProssible;
}