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...