面試題22 根據棧的壓入序列,判斷彈出序列是否合法

2021-07-14 21:24:42 字數 1370 閱讀 1229

1.輸入兩個整數序列,第乙個式進棧的順序序列,第二個是出棧的順序序列,判斷出棧的序列是否合法。

分析:先根據出站的序列,來判斷是非要進棧,如果當前的棧頂的元素和出站序列中的要比較的元素不相等,剩餘的進棧序列繼續進棧,直到棧頂的元素和出站的序列的元素相等。如果相等的話,則彈出棧頂的元素,繼續比較下乙個元素,按照相同的規則,直到所有的進棧序列都進棧,如果出現所有的待進棧的序列都進棧了,但是都沒有找到棧頂的元素等於帶比較的出站序列中的元素的話,則證明這個出站的序列不是正確的,不可能得到。下面是圖示:

能得到的出站的序列

不可能得到的出站序列

原始碼:

#include#includeusing namespace std;

bool ispoporder(const int* ppush, const int* ppop, int nlength)

if (stackdata.top() != *pnextpop)

break;

stackdata.pop();//此時棧頂的資料等於npop序列的元素,可以比較下乙個

pnextpop++;

} if (stackdata.empty() && pnextpop - ppop == nlength)//棧為空並且npop序列中元素全部比較完成,才滿足要求

bpossible = true;

} return bpossible;

}int main()

; int pop[nlength] = ;

int pop_2[nlength] = ;

bool result = ispoporder(push, pop, nlength);

if (result == true)

cout << "correct" << endl;

else

cout << "error" << endl;

result = ispoporder(push, pop_2, nlength);

if (result == true)

cout << "correct" << endl;

else

cout << "error" << endl;

system("pause");

return 0;

}

結果:

面試題22 棧的壓入彈出序列

題目 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。思路 如果下乙個彈出的數字剛好...

面試題22 棧的壓入 彈出序列

題目 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入序列,序列4,5,3,2,1,是該壓棧序列對應的乙個彈出序列。但4,3,5,1,2就不可能是該壓棧序列的彈出序列。棧是一種 後進先出 lifo...

面試題22 棧的壓入 彈出序列

題目描述 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出序列,假設壓入棧的所有數字不相等。例如序列1,2,3,4,5是某棧的壓棧順序,序列4,5,3,2,1是該棧對應的乙個彈出序列,但是4,3,5,1,2就不可能是該壓棧順序的彈出序列。解決方案 1 public st...