資料結構學習筆記 棧

2021-09-11 06:47:30 字數 2721 閱讀 7740

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...