已知壓棧序列,判斷合法的彈出序列

2021-07-05 14:01:17 字數 959 閱讀 4554

問題描述:

輸入兩個整數序列,第乙個表示棧的壓入順序,判斷第二個序列是否為該棧的彈出序列(假設壓棧的所有數字均不相等)。

例如:序列1,2,3,4,5是壓棧序列,那麼序列4,5,3,2,1就是乙個合法的彈出序列,而4,3,5,1,2則不可能是合法的彈出序列。

問題出自《劍指offer》面試題22。

解題**:

思路和書中講訴類似:如果下乙個彈出元素正好是棧頂元素,則直接彈出。否則把壓棧序列中還沒有入棧的元素依次入棧,直到棧頂元素等於彈出序列中要彈出的元素。如果所用元素都壓棧了,並且棧頂元素任然不等於要彈出元素,則不合法。

**實現上和書中有所區別:用兩個下標i,j分別掃瞄壓棧序列和彈出序列,迴圈的退出條件是:j < n && (i < n || !sta.empty())。退出迴圈時,如果彈出序列掃瞄完畢,則該彈出序列是合法的,否則不合法。

**注意兩點:

1,當i == n時,如果棧不為空,迴圈不能退出,還要繼續執行迴圈體;

2,判斷當前出棧元素是不是當前棧頂元素之前,要判斷棧是否為空。如不判斷,在棧為空時,執行取棧頂元素,程式異常。

**如下:

#include #include #include using namespace std;

bool judge(int *a, int *b, int n) else else

} }if (j == n) return true;

else return false;

}int main()

int *b = new int[n];

for (i = 0; i < n; i++)

bool rslt = judge(a, b, n);

printf("%d\n", rslt);

}}

判斷棧的壓入,彈出序列

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

棧的壓入彈出序列的合法性

描述 輸入兩個整數序列,第乙個整數序列表示棧的壓 入順序,請判斷第二個序列是否為棧的彈出序列 方法 定義乙個棧,剛開始時將第乙個元素壓入棧中,然後判斷棧頂的元素和第二個序列的元素是否 相同,如果相同則pop掉棧頂的這個元素,否則 繼續壓入第乙個序列到棧中,以此進行匹配,得出結果。define crt...

棧的壓入彈出序列

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