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

2021-07-02 23:22:02 字數 1412 閱讀 2839

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

思路:如果下乙個彈出的數字剛好是棧頂數字,則直接彈出。若下乙個彈出的數字不在棧頂,則把壓棧序列中還沒有入棧的數字壓入輔助棧,直到把下乙個需要彈出的數字壓入棧頂為止。若所有的數字都壓入棧了仍沒有找到下乙個彈出的數字,則表明該序列不可能是乙個彈出序列。

過程:記錄壓棧數判斷元素是否全部壓棧,記錄彈出序列的當前元素下標。

壓棧序列從第乙個元素開始壓棧,壓棧之後判斷彈出序列的第乙個元素是否與棧頂元素相等,如果不相等繼續壓棧並判斷,直到所有的元素都入棧,如果此過程中沒有找到與棧頂元素相等的值則不是該棧的彈出序列,如果彈出序列當前值和棧頂元素相等,棧頂元素出棧,當前彈出序列的元素下標+1,繼續將彈出序列的下一位和棧頂元素相比。

#include #include using namespace std;

/*ppush為壓棧的序列(序列放入乙個陣列)的陣列首位址

ppop為判斷的出棧序列陣列首位址

length為陣列長度

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

//建立乙個輔助棧

stacks;

//將序列的第乙個元素壓棧

s.push(ppush[0]);

int npop_index = 0;//出棧的個數

int npush_index = 1; //壓棧的個數

//判斷是否出棧完畢

while (npop_index < nlength)

//如果棧頂元素與出棧序列數字相等,將元素出棧,判斷下乙個元素

if (s.top() == ppop[npop_index])

else

}return true;

}int main()

; int npop1[5] = ;

int npop2[5] = ;

int npop3[5] = ;

int npop4[5] = ;

cout << ispoporder(npush, npop1, 5) << endl;

cout << ispoporder(npush, npop2, 5) << endl;

cout << ispoporder(npush, npop3, 5) << endl;

cout << ispoporder(npush, npop4, 5) << endl;

system("pause");

return 0;

}

面試題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...

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

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