棧學習(2)
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
相關文章
- 棧的學習筆記筆記
- 單調棧學習小思考
- JVM學習筆記之棧區JVM筆記
- 全棧資料工程學習-sublime全棧
- CUDA 學習筆記之程式棧筆記
- 棧(2)--棧的應用
- 全棧工程師學習路線全棧工程師
- 資料結構學習筆記--棧資料結構筆記
- 快速學習 Spring Boot 技術棧Spring Boot
- HTML5全棧學習方式有哪些?HTML全棧
- Docker學習2Docker
- flask學習2Flask
- Qt學習2QT
- CGAL——學習2
- php學習(2)PHP
- 學習perl(2)
- HTML學習-2HTML
- css學習2CSS
- odoo學習-2Odoo
- 強化學習-學習筆記2 | 價值學習強化學習筆記
- JVM學習筆記五--虛擬機器棧JVM筆記虛擬機
- Java ASM學習(2)JavaASM
- Python學習(2)Python
- Qt學習之路2QT
- Timesten學習2
- ruby 字串學習2字串
- python學習2Python
- 4/2學習程序
- Java全棧學習路線、學習資源和麵試題一條龍Java全棧
- 【caffe2從頭學】:2.學習caffe2
- 全棧工程師技術學習路線圖全棧工程師
- 學習JavaScript資料結構(一)——棧和佇列JavaScript資料結構佇列
- 笨辦法學C 練習42:棧和佇列佇列
- 深入學習js之——執行上下文棧#3JS
- 全全全棧測試開發學習路線全棧
- Python全棧學習_day003知識點Python全棧
- Python全棧學習_day006作業Python全棧
- 【C++學習筆記】啥叫堆?啥叫棧?C++筆記