【資料結構】兩棧共享空間的進一步理解
目錄
前言
在閱讀《大話資料結構》時,對文中“兩棧共享空間”中部分知識點存在困惑,多讀了幾遍後,將其中的疑惑進行梳理一下。
(關於書中“兩棧共享空間”的知識點,大家可以看一下我之前的部落格 【大話資料結構】第四章總結——棧與佇列)
正文
在書中95頁提到了兩棧共享空間的知識點,以下為原文
對①中的理解:
這裡出現了一個n,還是比較好理解的
n就是指陣列的長度,也就是用來儲存兩個棧的陣列的長度,如下圖所示
對②中的疑惑:
棧1空時,top1等於-1,那top2的取值是否會影響棧1空?
棧2空時,top2等於n,那top1的取值是否會影響棧2空?
先列舉了棧1為空時,可能出現的情況
- 棧1空,棧2空
- 棧1空,棧2有值(未滿)
- 棧1空,棧2滿
情況1:棧1空、棧2空
此時棧的情況如下,top1=-1,top2=n(即陣列的長度)
情況2:棧1空、棧2有值
此時棧的情況如下,top1=-1,top2=n-1(即棧2存放了一個元素)
情況3:棧1空、棧2滿,這裡存在兩種情況
- 第一種是棧2的top2=n-3(如下圖所示)
- 第二種是棧2的top2=0(如下圖所示)
那麼問題來了
第一種情況下的棧1為空還可以理解,但是第二種情況下呢?
此時棧1好像被填滿了,這時應該不能算是棧1空吧?
個人認為
棧1是否為空,不能只看圖中棧1是否有元素,而是應該看指向棧底的top指標
在棧的定義中,關於空棧的判定就是看top指標的,如果top=-1,即視為空棧
第二種情況下,由於這是一個兩棧共享空間
的資料結構其關鍵思路就是:新增元素在陣列的兩端向中間靠攏
所以棧1的空間應該也是可以被棧2所共享
此時的top1仍然是-1,而top2是0,棧1為空,棧2為滿
關於第一個疑問的解釋
無論top2的值為多少,只要top1=-1,即可將棧1視為空棧
同理,第二個問題的解答也是如此
列舉了棧2為空時,可能出現的情況
- 棧2空,棧1空
- 棧2空,棧1有值(未滿)
- 棧2空,棧1滿
情況1:棧2空,棧1空
此時棧的情況如下,top2=n,top1=-1(即陣列的長度)
情況2:棧2空、棧1有值
此時棧的情況如下,top2=n-1,top1=0(即棧1存放了一個元素)
情況3:棧2空、棧1滿,這裡也是存在兩種情況
- 第一種是棧1的top1=2(如下圖所示)
- 第二種是棧1的top1=n-1(如下圖所示)
這裡我就不推導了,過程跟上面推導棧1為空的一樣
所以第二個疑問的解釋
無論top1的值為多少,只要top2=n,即可將棧2視為空棧
對③④中的理解:
如果你看懂了②中的解釋,那麼對③④的理解估計也比較容易了
③中極端情況下,棧1滿的前提是棧2為空棧,棧1的top1=n-1
此時棧2為空,top2=n,top1=n-1,如下圖所示
注意!!!
這裡的n仍然是陣列的長度!!!注意是陣列的長度,不是單個棧的長度!!!
④中極端情況下,棧2滿的前提是棧1為空棧,棧2的top2=0
此時棧1為空,top1=-1,top2=0,如下圖所示
這裡的top2=0的0是陣列下標的意思!!!注意是陣列的下標,不是棧2的棧底!!!
也就是說
文中出現的所有的n,都是陣列的長度n!!!
文中出現的所有的0,都是陣列的下標0!!!
一開始我就是理解錯了,導致後面無法看懂,仔細琢磨後才大概弄懂了
(或許只有我一個人理解錯了吧orz)
對棧滿條件的理解:
判斷棧滿的條件是:兩個指標之間相差1時,即top1 + 1 == top2為棧滿
一開始我以為只有下面這種情況才是棧滿
即只有top1跟top2在中間相遇這種情況,如下top1=n-4,top2=n-5
但是後來發現,因為這是一個兩棧共享空間的資料結構
所以可以出現以下棧滿的情況
- 棧1空,棧2佔據所有棧1的空間
- 棧1有值,棧2佔據部分棧1空間
- 棧1佔據所有棧2的空間,棧2空
情況1:棧1空,棧2佔據所有棧1的空間(或棧2空,棧1佔據所有棧2的空間)
此時top1=-1,top2=0,滿足top1 + 1 == top2,棧滿
情況2:棧1有值,棧2佔據部分棧1空間(或棧2有值,棧1佔據部分棧2空間)
此時top1=0,top2=1,滿足top1 + 1 == top2,棧滿
情況3:棧1佔據所有棧2空間,棧2空(或棧2佔據所有棧1空間,棧1空)
此時top1=n-1,top2=n,滿足top1 + 1 == top2,棧滿
結論:
無論棧1棧2的元素怎麼儲存,只要滿足top1 + 1 == top2,棧就是滿的
總結
不知道有沒有人跟我有一樣的疑惑orz,如果有的話,希望這篇文章可以幫助到你們。
以上為個人的觀點,如果有啥需要指正的地方,歡迎在下面留言評論。
其實我感覺,學習資料結構沒有啥捷徑,理解跟思考挺重要的,再者,多畫圖有助於思考,加油!