簡單資料結構的妙用(二) 兩棧共享空間

2021-10-14 23:37:35 字數 1595 閱讀 7401

目錄

簡單資料結構的妙用(二):兩棧共享空間

一、參考文章

二、背景

三、實現

內容主要出自程杰的《大話資料結構》兩棧共享空間一節。

棧的順序儲存還是很方便的,因為只准棧頂進出元素。但是它有乙個很大的缺陷,就是必須實現確定陣列儲存空間大小,萬一不夠用了,就需要程式設計手段來擴充套件陣列的容量,非常麻煩。對於乙個棧,只能盡量考慮周全,設計出合適大小的陣列來處理,但對於兩個相同型別的棧,卻可以最大限度地利用其事先開闢地儲存空間來進行操作。

如果有兩個相同型別地棧,為它們各自開闢陣列空間,極有可能是第乙個棧已經滿了,再進棧就溢位了,而另乙個棧還有很多儲存空間空閒,這樣完全可以用乙個陣列來儲存兩個棧。

陣列有兩個端點,兩個棧有兩個棧底,讓乙個棧地棧底為陣列地始端,即下標為0處,另乙個為陣列的末端,即下標為n-1處,這樣,如果元素增加,就是兩端點向中間延伸。如圖所示:

關鍵思路:兩個棧是在陣列的兩端,向中間靠攏。top1和top2是棧1和棧2的棧頂指標,只要它們不見面,兩個棧就可以一直使用。

top1 = -1時,棧1為空,top2 = n時,棧2為空。

極端情況,若棧2為空,棧1的top1為n-1時,棧1滿了。反之,棧1為空,棧2的top2為0時,棧2滿了。

兩棧見面之時,也就是兩個指標之間相差1時,即top1 + 1 == top2為棧滿。

兩棧共享空間的結構的**如下:

// 兩棧共享空間結構

typedef struct sqdoublestack;

對於兩棧共享空間的push方法,除了要插入元素值引數外,還需要有乙個判斷棧1還是棧2的棧號引數stacknumber。

插入元素的**如下:

// 插入元素e為新的棧頂元素

bool push (sqdoublestack *s, selemtype e, int stacknumber)

if (stacknumber == 1)

else if (stacknumber == 2)

return true;

}

對於兩棧共享空間的pop方法,引數就只是判斷棧1棧2的引數stacknumber,**如下:

// 若棧不空,則刪除s的棧頂元素,用e返回其值,並返回true;否則,返回false;

bool pop (sqdoublestack *s, selemtype e, int stacknumber)

e* = s->data[s->top1--];  // 將棧1的棧頂元素出棧

}else if (stacknumber == 2)

e* = s->data[s->top2++];  // 將棧2的棧頂元素出棧

}return true;

}

使用這樣的資料結構,通常都是當兩個棧的空間需求有相反關係時,也就是乙個棧增長時另乙個棧在縮短的情況。否則兩個棧都在不停地增長,很快就會溢位了。

同時,這必須是兩個具有相同資料型別的棧。

簡單資料結構的實現之順序棧

include using namespace std const int stack init size 100 ifndef sqstack h included define sqstack h included template class sqstack int stacklength e...

資料結構中棧的相關操作(共享棧)

為共享棧的相關操作,主要操作為初始化棧 兩端分別入棧出棧,分別進行棧頂元素獲取等功能。由標頭檔案 sqdoublestack.h 介面實現 sqdoublestack.c 和測試檔案 main.c 三部分組成。sqdoublestack.h ifndef sqdstack define sqdsta...

資料結構與演算法之 兩棧共享儲存空間

其實棧的順序儲存很方便,因為它只在表尾進行操作,不存在普通線性表插入與刪除還需要移動元素的情況。同樣它也有普通線性表的缺陷,即必須確定數量。然而對於兩個相同型別的棧,卻可以做到最大限度地利用其開闢的儲存空間來進行操作。陣列有兩個端點,兩個棧使用這乙個陣列的儲存區域,兩個棧有兩個棧底,分別為陣列的始端...