1. 程式人生 > >【資料結構】兩棧共享空間的進一步理解

【資料結構】兩棧共享空間的進一步理解

目錄

前言

正文

對①中的理解:

對②中的疑惑:

 

對③④中的理解:

 

對棧滿條件的理解:

總結 


前言

在閱讀《大話資料結構》時,對文中“兩棧共享空間”中部分知識點存在困惑,多讀了幾遍後,將其中的疑惑進行梳理一下。

(關於書中“兩棧共享空間”的知識點,大家可以看一下我之前的部落格 【大話資料結構】第四章總結——棧與佇列

 

正文

在書中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,如果有的話,希望這篇文章可以幫助到你們。

以上為個人的觀點,如果有啥需要指正的地方,歡迎在下面留言評論。

其實我感覺,學習資料結構沒有啥捷徑,理解跟思考挺重要的,再者,多畫圖有助於思考,加油!