目錄
簡單資料結構的妙用(二):兩棧共享空間
一、參考文章
二、背景
三、實現
內容主要出自程杰的《大話資料結構》兩棧共享空間一節。
棧的順序儲存還是很方便的,因為只准棧頂進出元素。但是它有乙個很大的缺陷,就是必須實現確定陣列儲存空間大小,萬一不夠用了,就需要程式設計手段來擴充套件陣列的容量,非常麻煩。對於乙個棧,只能盡量考慮周全,設計出合適大小的陣列來處理,但對於兩個相同型別的棧,卻可以最大限度地利用其事先開闢地儲存空間來進行操作。
如果有兩個相同型別地棧,為它們各自開闢陣列空間,極有可能是第乙個棧已經滿了,再進棧就溢位了,而另乙個棧還有很多儲存空間空閒,這樣完全可以用乙個陣列來儲存兩個棧。
陣列有兩個端點,兩個棧有兩個棧底,讓乙個棧地棧底為陣列地始端,即下標為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...
資料結構與演算法之 兩棧共享儲存空間
其實棧的順序儲存很方便,因為它只在表尾進行操作,不存在普通線性表插入與刪除還需要移動元素的情況。同樣它也有普通線性表的缺陷,即必須確定數量。然而對於兩個相同型別的棧,卻可以做到最大限度地利用其開闢的儲存空間來進行操作。陣列有兩個端點,兩個棧使用這乙個陣列的儲存區域,兩個棧有兩個棧底,分別為陣列的始端...