資料結構 棧(靜態棧和動態棧)

2021-10-04 07:31:58 字數 1457 閱讀 4997

棧的性質:後進先出(lifo)

棧可以分為兩種:靜態棧和動態棧

兩種棧的實現都可以復用單鏈表的**,其中靜態棧可以復用順序表的**;動態棧可以復用單鏈表的**。其實可以從頭到尾實現乙個棧資料結構,但是那樣做是沒有意義的。**復用的思想是工程中常見的,而且基於已經測試過的**就減少了中間會遇到的其它問題。

首先是靜態棧的實現,專案中需要新增之前實現的順序表**。需要注意的是棧頂的選擇可以有兩種方式,在順序表的頭部或者尾部,這裡選擇線性表的尾部作為棧頂,也就是說只能允許在這一端進行操作;相應的在進行出棧操作時也是從線性表的尾部開始。

seqstack* seqstack_greate(int capacity)

void seqstack_destroy(seqstack* stack)

void seqstack_clear(seqstack* stack)

int seqstack_push(seqstack* stack, void* item)

void* seqstack_pop(seqstack* stack)

// 返回棧頂元素

void* seqstack_top(seqstack* stack)

int seqstack_size(seqstack* stack)

int seqstack_capacity(seqstack* stack)

動態棧的實現比順序棧要複雜,首先需要定義結點的結構體,用來表示每次進棧或者出棧的元素,然後進棧和出棧的操作也要malloc和free相應的記憶體空間。

// 定義棧的每乙個結構體組成

typedef struct _tag_linkstacknode

tlinkstacknode;

// 建立乙個只含頭結點的棧

linkstack* linkstack_create()

void linkstack_destroy(linkstack* stack)

// 鍊錶中的每乙個元素都是malloc出來的,單純clear會產生記憶體洩漏

void linkstack_clear(linkstack* stack)

}int linkstack_push(linkstack* stack, void* item)

if(!ret)

return ret;

}void* linkstack_pop(linkstack* stack)

return ret;

}void* linkstack_top(linkstack* stack)

return ret;

}int linkstack_size(linkstack* stack)

資料結構 棧 棧

可以把棧想像成乙個桶 進棧 就是把和桶口一樣大的燒餅往桶裡面扔 出棧 就是把燒餅拿出來 特點 先進後出。先扔進去的燒餅最後才能拿出來,最後扔進去的燒餅,第乙個拿出來 剛開始top 1 top 1 然後把進棧的元素賦值給data top 入棧操作 void push stack s,int x els...

資料結構 棧 順序棧和鏈棧

順序棧 基於陣列的順序棧 include include include typedef enum status status typedef int elemtype typedef struct sqstack sqstack 函式宣告 基於陣列的順序棧 status initstack sqs...

資料結構 棧(靜態陣列)

棧是先進先出的一種資料結構。本文是以靜態陣列為儲存結構的棧的實現。棧的adt如下 資料元素集合 乙個元素的有序序列,只能在棧頂進行入棧和出棧的操作 基本方法 1.stack 建立乙個空棧 2.empty 檢查棧是否為空 3.push 在棧頂新增乙個元素 4.top 提取棧頂元素 5.pop 刪除棧頂...