1.定義
棧(stack)是限定僅在表尾進行插入和刪除操作的線性表。
根據定義我們知道棧在本質上也是一種線性表,只是在插入和刪除操作上進行了限制。
我們把允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom),不含任何元素的棧稱為空棧。棧又稱為後進先出(last in first out)的線性表,簡稱lifo結構。
棧的插入操作,叫做進棧,也稱壓棧,入棧,類似子彈入彈夾。
棧的刪除操作,叫做出棧,也有的叫作彈棧,如同彈夾中的子彈出夾。
應用:瀏覽器的「後退」鍵,word、photoshop等文件或影象編輯軟體中的撤銷(undo)操作等。
2.棧的抽象資料型別
1.initstack(*s):初始化操作,建立乙個空棧s。
2.destroystack(*s):若棧存在,則銷毀它。
3.clearstack(*s):將棧清空。
4.stackempty(s):若棧為空,返回true,否則返回false。
5.gettop(s, *e):若棧存在且非空,用e返回s的棧頂元素。
6.push(*s, e):若棧s存在,插入新元素e到棧s中並成為棧頂元素。
7.pop(*s, *e):刪除棧s中棧頂元素,並用e返回其值。
8.stacklength(s):返回棧s的元素個數。
3.棧的儲存結構
(1)棧的順序儲存結構
下面來看一下棧的順序儲存結構的**實現
typedef int selemtype;
//selemtype型別根據實際情況而定,這裡假設為int
typedef structsqstack;
進棧操作
status push
(sqstack *s, selemtype e)
出棧操作
status pop
(sqstack *s, selemtype *e)
兩棧共享空間
下面是兩棧共享空間結構的實現**
typedef structsqdoublestack;
入棧操作
對於兩棧共享空間的push方法,我們除了要插入元素值引數外,還需要有乙個判斷是棧1還是棧2的棧號引數stacknumber。
//插入e為新的棧頂元素
status push
(sqdoublestack *s, selemtype e, int stacknumber)
出棧操作
//若棧不空,則刪除s的棧頂元素,用e返回其值,並返回ok否則返回error
status pop
(sqdoublestacck *s, selemtype *e, int stacknumber)
else
if(stacknumber ==2)
returnok;
}
事實上,使用這樣的資料結構,通常都是當兩個棧的空間需求有相反關係時,也就是乙個棧增長時另乙個棧在縮短的情況。
(2)棧的鏈式儲存結構
由於單鏈表有頭指標,而棧頂指標也是必須的,那幹嘛不讓它倆合二為一呢,所以比較好的辦法是把棧頂放在單鏈表的頭部。另外,都已經有了棧頂在頭部了,單鏈表中比較常用的頭結點也就失去了意義,通常對於鏈棧來說,是不需要頭結點呢。
下面是鏈棧的實現**
typedef struct stacknodestacknode,
*linkstackptr;
typedef struct linkstacklinkstack;
鏈棧的操作絕大部分都和單鏈表類似,只是在插入和刪除上,特殊一些。
進棧操作
//插入元素e為新的棧頂元素
status push
(linkstack *s, selemtype e)
出棧操作
//若棧不空,則刪除s的棧頂元素,用e返回其值,並返回ok;否則返回error
status pop
(linkstack *s, selemtype *e)
順序棧和鏈棧的區別:
對於空間效能,順序棧需要事先確定乙個固定的長度,可能會存在記憶體空間浪費的問題,但它的優勢是訪問時定位很方便,而鏈棧則要求每個元素都有指標域,這同時也增加了一些記憶體開銷,但對於棧的長度無限制。
4.棧的作用
棧的引入簡化了程式設計的問題,劃分了不同關注層次,使得思考範圍縮小,更加聚焦於我們要解決的問題核心。反之,像陣列等,因為要分散精力去思考陣列的下標增減等細節問題,反而掩蓋了問題的本質。
資料結構學習筆記 棧
它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧 入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素 從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。p...
資料結構學習筆記5(棧)
在學習組合語言時候曾經簡要接觸過棧。棧可能是繼陣列之後在技術安吉科學中最基本的資料結構。基本思想是先進先出,可以看做是乙個桶。最先進入的最後出,最後進的最先出。棧可以用鍊錶或者陣列實現。陣列實現的缺點在於需要提前預知棧的大小,並定義出來 但是,一般在應用程式中,即使有相當多的棧操作,在任意時刻站元素...
資料結構學習 棧
這一系列部落格的目的在於複習鞏固資料結構的基礎知識,為考研面試筆試做準備,所以重在原理,實踐不是重點。參考書籍有嚴蔚敏老師的 資料結構 c語言版 c c 資料結構與演算法速學速用大辭典 define stacksize 100 typedef int datatype typedef structs...