元素出棧、入棧順序的合法性。如:入棧的序列(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;
}