題目描述
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否爲該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。
解析
如果下一個彈出的數字剛好是棧頂數字,那麼直接彈出。如果下一個彈出的數字不在棧頂,需要把壓棧序列中還沒有入棧的數字壓入輔助棧,直到把下一個需要彈出的數字壓入棧頂爲止。如果所有數字都壓入棧了,仍然沒有找到下一個彈出的數字,那麼該序列不可能是一個彈出序列。
實現
bool IsPopOrder(const int* pPush, const int* pPop, int nLength){
bool result = false;
if (pPush == NULL || pPop == NULL || nLength <= 0)
return result;
const int* pNextPop = pPop;
const int* pNextPush = pPush;
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)
result = true;
return result;
}