棧是一種遵循元素後進(push)先出(pop)規則的線性表,即最後加入的元素最先出來,它的實現可以用陣列或者鍊錶。
它的特點如下:
我們已經說過了,棧是一種線性表,故其底層是基於陣列或者鍊錶的。那麼,我們的重點是維護一種規則,即後進先出。
我們始終要有乙個變數l來記錄最後乙個元素的位置:
當彈出時,將l位置元素進行刪除,然後更新l,即l-1。
也正是因為,我們使用的是線性表,正好可以利用其尺寸來表示l,即線性表的大小可以表示最後乙個元素的位置。
2.1、棧的實現
class mystack3.1、對棧的結構定義:/**插入乙個元素到棧中. */
public void push(int x)
/**檢查是否為空 */
public boolean isempty()
/**到達棧頂. */
public int top()
/** 刪除乙個元素. 操作成功返回true. */
public boolean pop()
data.remove(data.size() - 1);
return true;}};
typedef structsqstack;
說明:1.base表示棧底指標,在判斷出棧、初始化和重新分配空間的時候需要用到。3.2、初始化棧:2.top表示棧頂指標,是棧最關鍵和核心的組成,入棧時top向上移動,出棧時top向下移動。
3.此處的stacksize並不表示當前的棧中的元素數量,而是表示棧的容量,也就是能裝多少個元素。
int initstack(sqsatck *s)
說明:1.順序棧初始化無非就是給棧分配連續的記憶體空間,base是棧底指標,在上面提到過,它用來指示一段連續的記憶體空間的首位址,也就是用來初始化。3.3、壓棧2.分配空間不意味著一定會有那麼多空間,所以判斷也不可缺少。
3.分配空間後,base和top的位址應該一致,此時top還沒有移動。
int push(sqstack * s,int elem)說明:1.壓棧是棧的核心操作,關鍵步驟無非是*s->top++=elem;但是在進行此步操作時,一定要判斷棧是否超出容量。*s->top++=elem;
return 1;
}
2.如果棧超出容量,則要在進行原空間的基礎上重新分配空間,realloc是關鍵的命令。
realloc原型:extern void *realloc(void *mem_address, unsigned int newsize);3.分配空間以後,在修改stacksize之前,top應該保持在容量頂端,s->top=s->base+s->stacksize;用法:#include 有些編譯器需要#include
功能:改變mem_address所指記憶體區域的大小為newsize長度。
說明:如果重新分配成功則返回指向被分配記憶體的指標,否則返回空指標null。
當記憶體不再使用時,應使用free()函式將記憶體塊釋放。
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為棧頂元素。根據棧的定義可知,棧頂元素總是最後入棧並且最先出棧的 棧底元素總是最先入棧並且最後出棧的。即棧是按後進...