資料結構 順序棧的實現

2022-03-11 11:13:02 字數 2230 閱讀 9624

棧是一種遵循元素後進(push)先出(pop)規則的線性表,即最後加入的元素最先出來,它的實現可以用陣列或者鍊錶。

它的特點如下:

我們已經說過了,棧是一種線性表,故其底層是基於陣列或者鍊錶的。那麼,我們的重點是維護一種規則,即後進先出。

我們始終要有乙個變數l來記錄最後乙個元素的位置:

當彈出時,將l位置元素進行刪除,然後更新l,即l-1。

也正是因為,我們使用的是線性表,正好可以利用其尺寸來表示l,即線性表的大小可以表示最後乙個元素的位置。

2.1、棧的實現 

class mystack 

/**插入乙個元素到棧中. */

public void push(int x)

/**檢查是否為空 */

public boolean isempty()

/**到達棧頂. */

public int top()

/** 刪除乙個元素. 操作成功返回true. */

public boolean pop()

data.remove(data.size() - 1);

return true;}};

3.1、對棧的結構定義:

typedef struct

sqstack;

說明:1.base表示棧底指標,在判斷出棧、初始化和重新分配空間的時候需要用到。

2.top表示棧頂指標,是棧最關鍵和核心的組成,入棧時top向上移動,出棧時top向下移動。

3.此處的stacksize並不表示當前的棧中的元素數量,而是表示棧的容量,也就是能裝多少個元素。

3.2、初始化棧:

int initstack(sqsatck *s)

說明:1.順序棧初始化無非就是給棧分配連續的記憶體空間,base是棧底指標,在上面提到過,它用來指示一段連續的記憶體空間的首位址,也就是用來初始化。

2.分配空間不意味著一定會有那麼多空間,所以判斷也不可缺少。

3.分配空間後,base和top的位址應該一致,此時top還沒有移動。

3.3、壓棧

int push(sqstack * s,int elem)

*s->top++=elem;

return 1;

}

說明:1.壓棧是棧的核心操作,關鍵步驟無非是*s->top++=elem;但是在進行此步操作時,一定要判斷棧是否超出容量。

2.如果棧超出容量,則要在進行原空間的基礎上重新分配空間,realloc是關鍵的命令。

realloc原型:extern void *realloc(void *mem_address, unsigned int newsize); 

用法:#include 有些編譯器需要#include

功能:改變mem_address所指記憶體區域的大小為newsize長度。 

說明:如果重新分配成功則返回指向被分配記憶體的指標,否則返回空指標null。 

當記憶體不再使用時,應使用free()函式將記憶體塊釋放。 

3.分配空間以後,在修改stacksize之前,top應該保持在容量頂端,s->top=s->base+s->stacksize;

2.4出棧

int pop(sqstack *q)

說明:1.出棧是簡單操作,其實這裡並沒有完美的實現這個效果,你應該考慮到如果在擴容後又迅速減小,會造成大量的空間浪費。 

2.5遍歷棧

int printfstack(sqstack *s)

}

資料結構遍歷順序棧 資料結構 順序棧的實現

資料結構 順序棧的實現 1 快速開始 棧是一種遵循元素後進 push 先出 pop 規則的線性表,即最後加入的元素最先出來,它的實現可以用陣列或者鍊錶。它的特點如下 先出,先入後出。除了頭尾節點之外,每乙個元素有乙個前驅,有乙個後繼。2 實現棧 我們已經說過了,棧是一種線性表,故其底層是基於陣列或者...

資料結構 棧的順序的實現

include include define stack size 100 棧的初始容量 define stackincrease 10 每次的增量 typedef int elemtype typedef structsqstack bool initstack sqstack s void cl...

資料結構(C實現) 順序棧

棧是限定僅在表的一端進行插入或刪除的純屬表,通常稱允許插入,刪除的一端為棧頂 top 相應在的,則稱另一端為棧底 bottom 不含元素的棧則稱為空棧。所設棧s 則稱a1為棧底元素,an為棧頂元素。根據棧的定義可知,棧頂元素總是最後入棧並且最先出棧的 棧底元素總是最先入棧並且最後出棧的。即棧是按後進...