第三章 實踐2 學習心得(順序棧 陣列)

2022-08-30 14:00:31 字數 1370 閱讀 5603

題目及sample如下:

7-1 出棧序列的合法性 (20分)

給定乙個最大容量為 m 的堆疊,將 n 個數字按 1, 2, 3, ..., n 的順序入棧,允許按任何順序出棧,則哪些數字序列是不可能得到的?例如給定 m=5、n=7,則我們有可能得到,但不可能得到

。輸入第一行給出 3 個不超過 1000 的正整數:m(堆疊最大容量)、n(入棧元素個數)、k(待檢查的出棧序列個數)。最後 k 行,每行給出 n 個數字的出棧序列。所有同行數字以空格間隔。

對每一行出棧序列,如果其的確是有可能得到的合法序列,就在一行中輸出yes,否則輸出no

5 7 5

1 2 3 4 5 6 7

3 2 1 7 5 6 4

7 6 5 4 3 2 1

5 6 4 3 7 2 1

1 7 6 5 4 3 2

yesno

noyes

no先總結一下自己在第一遍敲**時的錯,一開始的思路是:按順序將元素入棧,直至棧滿。把棧頂元素跟需要檢驗的出棧序列相比較,如果相等,則出棧。最後檢驗是否棧空,如果是,就輸出yes,否則輸出no。錯誤**不堪入目就不貼上來啦。之所以做錯的原因是:搞不清楚入棧和把棧頂數字做比較那一塊要怎麼做。一開始覺得這兩個操作應該有個時間差,得先入棧完才能比較;但是棧的容量不夠,根本沒辦法入棧完。然後就一邊入棧一邊比較,但是這樣的話自己思路全亂了,巢狀了4、5個迴圈。

後來看了別人的部落格上ac的**,邊看邊敲,寫了詳細的注釋,ac**如下:

#include

#include //包含 stack的標頭檔案

using namespace std ;

stacks ;

int main()

t1 = 1 ; //t1: 可以理解為壓入棧的數字(1,2,3,4...,n)

t2 = 1 ; //t2: 可以理解為到陣列的第幾個位置(下標加1)

for(int i=1 ; i<=n ; i++)

int flag = 1 ; //用於判斷一種錯誤的特殊情況,此情況下出錯棧非空,無法用s.empty()判斷

while(1)

else if(!s.empty() && s.top() == a[t2])

else }}

if(!flag || !s.empty())

else cout << "yes" << endl ;

}return 0 ;

}ac的**裡簡化了需要入棧的情況,使用t1輔助比較,不需要每種情況都入棧。

然後學習了同組的珊珊的ac**,她是用陣列的做法。思路都是一樣的,不過把棧變成陣列stack[1007],將出、入棧變成陣列下標的變化。

《CSS世界》第三章學習心得

1 塊級元素和display為block的元素不是乙個概念,還有display為list item和table。2 清楚浮動偽元素不使用display list item原因是ie無效,但ie對於非偽元素設定display list item是有效的。3 單行文字居中,多行文字左對齊。文字內容文字內...

第三章(1) 順序棧

include include define stack size 100 define stackadd 10 typedef int selemtype typedef struct sqstack void initstack sqstack s s top s base look caref...

第三章 棧 佇列 陣列

1.假設棧初始為空,將中綴表示式 這題和上題區別就是rear指向隊尾元素,而不是隊尾元素的下乙個元素 4.設有下圖所示的火車車軌,入口到出口之間有n條軌道,列車的行進方向均為從左至右,列車可駛入任意一條軌道。現有編號為1 9的9列列車,駛入的次序依次是8,4,2,5,3,9,1,6,7。若期望駛出的...