棧學習(2)

王小東大將軍發表於2017-06-19

1.   若棧採用順序儲存方式儲存,現兩棧共享空間v[1……m],top[i]代表第i個棧(i=1,2)棧頂,棧1的底在v[1],棧2的底在v[m],則棧滿的條件是(B)

B top[1]+1=top[2]

分析:

m1和m2如果不相鄰,那麼要麼S[1]還可以允許元素入棧,要麼S[2]允許。只有m1 + 1 = m2時,沒有多餘的空間允許更多元素入棧,此時棧滿。

 

順序儲存方式,棧一從下往上,棧二從上往下,正好接上的時候棧滿。因此top[1]+1等於top[2]時棧滿。

 

2.   遞迴過程或函式呼叫時,處理引數及返回地址,要用一種稱為的資料結構。

3.   任何二叉樹的後序線索樹進行後序遍歷時都必須用棧。

(錯誤。線索二叉樹的結點增加了指向前驅結點和指向後繼結點的標識,因此在遍歷時無需要棧。)

一般情況下,二叉樹的後序線索樹是需要額外用到棧的。雖然每個節點都帶有前驅和後續指標,但若前驅和後續指標都被佔用,那麼只能用棧。只有左半邊或者只有右半邊的二叉樹遍歷也需要分情況的。只有左半邊的二叉樹,用後序遍歷不用棧,只有右半邊還是要棧。只有右半邊的二叉樹前序遍歷不要棧,只有左半邊的還是要棧。

 

線索二叉樹

n個結點的二叉連結串列中含有n+1(2n-(n-1)=n+1)個空指標域。利用二叉連結串列中的空指標域,存放指向結點在某種遍歷次序下的前趨和後繼結點的指標(這種附加的指標稱為"線索")。

 

4.   遞迴先序遍歷一個n節點,深度為d的二叉樹,需要棧空間的大小為O(d)

分析:因為二叉樹不一定是平衡的,也就是說深度d!=log n.有可能d>>log n,所以棧大小為O(d)。

二叉樹深度d滿足:logn<=d<=n;所以需要棧空間為O(d)。

 

5. 二叉排序樹中,查詢的平均時間複雜度是O(logn);

對於棧和佇列來說,查詢就意味著把元素挨個出棧或者出隊,故平均時間複雜度是O(n);

而雜湊表,直接通過關鍵碼查詢元素,平均為O(1);

故雜湊錶速度是最快的。

 

5.   一個棧的入棧序列為1,2,3……n,其出棧序列為p1,p2……pn。則p2=3,則p3的可能取值個數是:n-1.

分析:首先,棧的先進後出原則大家應該是知道的。

根據題意 p 2 = 3,可以知道 p 1 的可能情況有三種:1,2或 4。(看到有些人只想到了 1,2)

為啥這樣想呢?這裡估計還有一個關鍵是要考慮到 n 的大小。

當 n = 3 時, p 2 = 3 的話,那麼 p 1 有兩種情況 1 和 2 。

如果 p 1 = 1 ,那麼 p 3 = 2 ;如果 p 1 = 2 ,那麼 p 3 = 1 ;

此時的話我們就可以看到 p 3 只有兩種可能 1 或者 2 。符合(n - 1)個。

當 n > 3 時: p 2 = 3 的話,那麼 p 1 有三種情況 1 , 2 和 4 。

如果 p 1 = 1 ,那麼 p 3 = 2,4,5,... n (n - 2)個如果 p 1 = 2 ,那麼 p 3 = 1,4,5,... n (n - 2)個如果 p 1 = 4 ,那麼 p 3 = 2,5,6,... n (n - 3)個

此時的話我們就可以看到 p 3 的情況有 1,2,4,5,... n (n - 1)個。綜上所述就是 p 3 可能取值的個數是(n - 1)個。

 

6.   堆疊溢位的主要原因:

1)       可能由於迴圈的遞迴引起的;

2)       由於分配過大的區域性變數引起;

注意:堆是堆,棧是棧,堆疊是堆疊。陣列越界、沒有回收記憶體、深層次遞迴呼叫都會導致堆疊溢位。

 

補充:

1、記憶體洩露,比如某一陣列原先已定義好大小,但是在後續操作中存放的個數超出這一既定長度,會導致堆疊溢位;

2、由於程式設計師動態申請的記憶體塊使用後未立即釋放,導致記憶體區不夠用,也會導致堆疊溢位;

3、程式陷入死迴圈,往記憶體寫資料,不斷地消耗記憶體空間;

4、程式本身執行起來就要消耗一定大小的記憶體,但是系統提供的實際記憶體不夠,比如JVM虛擬記憶體不夠讓程式使用;

 

7.   下列說法錯誤的是(BD)

A 利用一組地址連續的儲存單元依次存放自棧底到棧頂的資料元素,這種形式的棧也稱為順序棧;

B top=0時為空棧,元素進棧時指標top不斷減一

C 當top等於陣列的最大下標值時,則棧滿;

D 棧不能對輸入序列部分或全域性起求逆作用;

分析:A正確,雖然鏈棧也可以實現地址連續,但無法做到依次存放資料元素,因為除了元素域還需要存放指標域。因此滿足條件的只有順序棧。

B錯誤,top= -1時為空棧,top=0只能說明棧中只有一個元素,並且元素進棧時top應該自增

C正確,top所指向的物件永遠是棧頂元素

D錯誤,棧的特性(先進後出)就決定了可以作為求逆元素的輔助空間。所謂求逆運算就是ABC依次入棧,輸入CBA

 

 

相關文章