棧 出棧序列正確性分析

2022-09-17 14:33:09 字數 1028 閱讀 9091

問題很簡單:在棧的性質下,1~n的數字按順序入棧,給出它們的出棧序列,判定該序列是否合理。

相比於之前遇到過的「求解所有可行出棧序列」,本問題的複雜度著實降低了不少。不過要把這個過程正確地通過code模擬出來,在邏輯的處理上也需要注意不少細節。

下面先來講講處理的方法:

程式輸入:n以及給定的出棧序列,出棧序列不妨設為q[n+1],其中q[1]~q[n]順序儲存正確性未知的出棧序列。

由於入棧是按順序入棧,可以不用額外的陣列儲存,僅需要乙個遞增的標誌a表示即可。同時,出棧序列也需要乙個指標b來儲存當前序列首部q[b]。

同時需要乙個棧stk來儲存壓棧的數字

迴圈執行以下幾步:

(1)比較當前序列首q[b]與a是否相等,相等則表示對當前的入棧數字a來說,它入棧後立即出棧,a自增1,出棧序列指標後移,即b自增1

(2)若不相等,那麼轉而判斷棧頂元素是否和當前出棧序列首部相等,若相等,則棧頂元素出棧,出棧序列指標繼續後移。

(3)若(1)(2)都不滿足,則判斷a是否已經大於n了,大於則不滿足出棧條件,並跳出迴圈,小於等於則將當前數字a壓棧,並自增1,轉而跳(1)

c++實現**如下

1 #include2 #include3

using

namespace

std;

4int n; //

輸入個數

5int f[100]; //

儲存出隊序列

6 stackstk;

7int

main()

18else

if(!stk.empty() && stk.top()==f[b])

22else

if(a<=n)

25else 28

} 29

if(flag) cout<<"

yes";30

else cout<<"no"

;31return0;

32 }

劍指offer 入棧 出棧正確性的判斷

判斷元素出棧 入棧順序的合法性。如 入棧的序列 1,2,3,4,5 出棧序列 是 4,5,3,2,1 是合法序列,入棧的序列 1,2,3,4,5 出棧序列為 1,5,3,2,4 是不合法序列 我的解題思路 建立乙個輔助棧來模擬入棧與出棧過程,從而判斷其入棧 出棧順序是否合法。定義兩個陣列in與out...

棧(出棧序列)

已知自然數1,2,n 1 n 10000 依次入棧 即a1 c2,cn 是否為可能的出棧序列。例如 n 5時,3,4,2,1,5是乙個可能的出棧序列,因為其可以按如下操作獲得 push 1,push 2,push 3,pop,push 4,pop,pop,pop,push 5,pop input 輸...

棧 出棧序列判定

給乙個初始的入棧序列,其次序即為元素的入棧次序,棧頂元素可以隨時出棧,每個元素只能入棧依次。輸入乙個入棧序列,後面依次輸入多個序列,請判斷這些序列是否為所給入棧序列合法的出棧序列。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個出棧序列,但4,3,5,1,2就...