第三章 棧和隊列
一 選擇題
1. 對於棧操作數據的原則是( B )。
A. 先進先出 B. 后進先出 C. 后進后出 D. 不分順序
2. 在作進棧運算時,應先判別棧是否( ① B ),在作退棧運算時應先判別棧是否( ② A )。當棧中元素為n個,作進棧運算時發生上溢,則說明該棧的最大容量為( ③B )。
為了增加內存空間的利用率和減少溢出的可能性,由兩個棧共享一片連續的內存空間時,應將兩棧的 ( ④ D )分別設在這片內存空間的兩端,這樣,當( ⑤C )時,才產生上溢。
①, ②: A. 空 B. 滿 C. 上溢 D. 下溢
③: A. n-1 B. n C. n+1 D. n/2
④: A. 長度 B. 深度 C. 棧頂 D. 棧底
⑤: A. 兩個棧的棧頂同時到達棧空間的中心點.
B. 其中一個棧的棧頂到達棧空間的中心點.
C. 兩個棧的棧頂在棧空間的某一位置相遇.
D. 兩個棧均不空,且一個棧的棧頂到達另一個棧的棧底.
3. 一個棧的輸入序列為123…n,若輸出序列的第一個元素是n,輸出第i(1<=i<=n)個元素是( B )。
A. 不確定 B. n-i+1 C. i D. n-i
4. 若一個棧的輸入序列為1,2,3,…,n,輸出序列的第一個元素是i,則第j個輸出元素是( D )。
A. i-j-1 B. i-j C. j-i+1 D. 不確定的
5. 若已知一個棧的入棧序列是1,2,3,…,n,其輸出序列為p1,p2,p3,…,pN,若pN是n,則pi是( D )。
A. i B. n-i C. n-i+1 D. 不確定
6. 有六個元素6,5,4,3,2,1 的順序進棧,問下列哪一個不是合法的出棧序列?(C )
A. 5 4 3 6 1 2 B. 4 5 3 1 2 6 C. 3 4 6 5 2 1 D. 2 3 4 1 5 6
7. 設棧的輸入序列是1,2,3,4,則(D )不可能是其出棧序列。
A. 1,2,4,3, B. 2,1,3,4, C. 1,4,3,2,
D. 4,3,1,2, E. 3,2,1,4,
8. 一個棧的輸入序列為1 2 3 4 5,則下列序列中不可能是棧的輸出序列的是( B )。
A. 2 3 4 1 5 B. 5 4 1 3 2 C. 2 3 1 4 5 D. 1 5 4 3 2
9. 設一個棧的輸入序列是 1,2,3,4,5,則下列序列中,是棧的合法輸出序列的是( D )。
A. 5 1 2 3 4 B. 4 5 1 3 2 C. 4 3 1 2 5 D. 3 2 1 5 4
10. 某堆棧的輸入序列為a, b,c ,d,下面的四個序列中,不可能是它的輸出序列的是( D )。
A. a,c,b,d B. b, c,d,a C. c, d,b, a D. d, c,a,b
11. 設abcdef以所給的次序進棧,若在進棧操作時,允許退棧操作,則下面得不到的序列為(D )。
A.fedcba B. bcafed C. dcefba D. cabdef
12. 設有三個元素X,Y,Z順序進棧(進的過程中允許出棧),下列得不到的出棧排列是( C )。
A.XYZ B. YZX C. ZXY D. ZYX
13. 輸入序列為ABC,可以變為CBA時,經過的棧操作為( B )
A.push,pop,push,pop,push,pop B. push,push,push,pop,pop,pop
C.push,push,pop,pop,push,pop D.push,pop,push,push,pop,pop
15. 若棧采用順序存儲方式存儲,現兩棧共享空間V[1..m],top[i]代表第i個棧( i =1,2)棧頂,棧1的底在v[1],棧2的底在V[m],則棧滿的條件是(B )。
A. |top[2]-top[1]|=0 B. top[1]+1=top[2] C. top[1]+top[2]=m D.top[1]=top[2]
16. 棧在(D )中應用。
A. 遞歸調用 B. 子程序調用 C. 表達式求值 D. A,B,C
17. 一個遞歸算法必須包括( B )。
A. 遞歸部分 B. 終止條件和遞歸部分 C. 迭代部分 D.終止條件和迭代部分
21. 設計一個判別表達式中左,右括號是否配對出現的算法,采用( D )數據結構最佳。
A.線性表的順序存儲結構 B. 隊列 C. 線性表的鏈式存儲結構 D. 棧
22. 用鏈接方式存儲的隊列,在進行刪除運算時( D )。
A. 僅修改頭指針 B. 僅修改尾指針 C. 頭、尾指針都要修改 D. 頭、尾指針可能都要修改
23. 用不帶頭結點的單鏈表存儲隊列時,其隊頭指針指向隊頭結點,其隊尾指針指向隊尾結點,則在進行刪除操作時( D )。
A.僅修改隊頭指針 B. 僅修改隊尾指針
C. 隊頭、隊尾指針都要修改 D. 隊頭,隊尾指針都可能要修改
24. 遞歸過程或函數調用時,處理參數及返回地址,要用一種稱為( C )的數據結構。
A.隊列 B.多維數組 C.棧 D. 線性表
33. 棧的特點是( ① ),隊列的特點是( ② ),棧和隊列都是( ③ )。若進棧序列為1,2,3,4 則( ④ )不可能是一個出棧序列(不一定全部進棧后再出棧);若進隊列的序列為1,2,3,4 則( ⑤ )是一個出隊列序列。BACCF
①, ②: A. 先進先出 B. 后進先出 C. 進優於出 D. 出優於進
③: A.順序存儲的線性結構 B.鏈式存儲的線性結構
C.限制存取點的線性結構 D.限制存取點的非線性結構
④, ⑤: A. 3,2,1,4 B.3,2,4,1 C. 4,2,3,1 D. 4,3,2,1 F. 1,2,3,4 G. 1,3,2,4
34. 棧和隊都是(C )
A.順序存儲的線性結構 B. 鏈式存儲的非線性結構
C. 限制存取點的線性結構 D. 限制存取點的非線性結構
二 判斷題
1. 消除遞歸不一定需要使用棧(√ )
2. 棧是實現過程和函數等子程序所必需的結構。( √ )
3. 兩個棧共用靜態存儲空間,對頭使用也存在空間溢出問題。(√ )
4.兩個棧共享一片連續內存空間時,為提高內存利用率,減少溢出機會,應把兩個棧的棧底分別設在這片內存空間的兩端。( √ )
5. 即使對不含相同元素的同一輸入序列進行兩組不同的合法的入棧和出棧組合操作,所得的輸出序列也一定相同。(× )
11. 任何一個遞歸過程都可以轉換成非遞歸過程。( √ )
12. 只有那種使用了局部變量的遞歸過程在轉換成非遞歸過程時才必須使用棧。( × )
13. 隊列是一種插入與刪除操作分別在表的兩端進行的線性表,是一種先進后出型結構。( × )
14. 通常使用隊列來處理函數或過程的調用。(× )
15. 隊列邏輯上是一個下端和上端既能增加又能減少的線性表。(√ )
16. 循環隊列通常用指針來實現隊列的頭尾相接。(× )
17. 循環隊列也存在空間溢出問題。( √ )
18. 隊列和棧都是運算受限的線性表,只允許在表的兩端進行運算。(× )
19. 棧和隊列都是線性表,只是在插入和刪除時受到了一些限制。(√ )
20. 棧和隊列的存儲方式,既可以是順序方式,又可以是鏈式方式。(√ )
四 應用題
1. 名詞解釋:棧、隊列、循環隊列?
棧是只准在一端進行插入和刪除操作的線性表,允許插入和刪除的一端叫棧頂,另一端叫棧底。最后插入的元素最先刪除,故棧也稱后進先出(LIFO)表。
隊列是允許在一端插入而在另一端刪除的線性表,允許插入的一端叫隊尾,允許刪除的一端叫隊頭。最先插入隊的元素最先離開(刪除),故隊列也常稱先進先出(FIFO)表。
循環隊列:用常規意義下順序存儲結構的一維數組表示隊列,由於隊列的性質(隊尾插入和隊頭刪除),容易造成“假溢出”現象,即隊尾已到達一維數組的高下標,不能再插入,然而隊中元素個數小於隊列的長度(容量)。循環隊列是解決“假溢出”的一種方法。通常把一維數組看成首尾相接。在循環隊列下,通常采用“犧牲一個存儲單元”或“作標記”的方法解決“隊滿”和“隊空”的判定問題
2.(1) 什么是遞歸程序?
(2) 遞歸程序的優、缺點是什么?
(3) 遞歸程序在執行時,應借助於什么來完成?
(4) 遞歸程序的入口語句、出口語句一般用什么語句實現?
(1)一個函數在結束本函數之前,直接或間接調用函數自身,稱為遞歸。例如,函數f在執行中,又調用函數f自身,這稱為直接遞歸;若函數f在執行中,調用函數g,而g在執行中,又調用函數f,這稱為間接遞歸。在實際應用中,多為直接遞歸,也常簡稱為遞歸。
(2)遞歸程序的優點是程序結構簡單、清晰,易證明其正確性。缺點是執行中占內存空間較多,運行效率低。
(3)遞歸程序執行中需借助棧這種數據結構來實現。
(4)遞歸程序的入口語句和出口語句一般用條件判斷語句來實現。遞歸程序由基本項和歸納項組成。基本項是遞歸程序出口,即不再遞歸即可求出結果的部分;歸納項是將原來問題化成簡單的且與原來形式一樣的問題,即向着“基本項”發展,最終“到達”基本項。
3. 簡述順序存儲隊列的假溢出的避免方法及隊列滿和空的條件。
假溢出避免方法:采取循環隊列的形式。
4. 舉例說明順序隊的“假溢出”現象,並給出解決方案。
5. 怎樣判定循環隊列的空和滿?
在循環隊列下,仍定義front=rear時為隊空,而判斷隊滿則用兩種辦法,一是用“犧牲一個單元”,即rear+1=front(准確記是(rear+1)%m=front,m是隊列容量)時為隊滿。另一種解法是“設標記”方法,如設標記tag,tag等於0情況下,若刪除時導致front=rear為隊空;tag=1情況下,若因插入導致front=rear則為隊滿。