鏈式棧的實現

2021-10-25 10:02:51 字數 4321 閱讀 4104

棧相比於鍊錶,它是一種特殊的資料模型,兩者既有聯絡(通過鍊錶的api函式可以改造出棧的api函式,這其中的原因在於兩者的底層邏輯是有相似的地方的,即:通過在鍊錶的頭部操作元素,就可以模擬出棧),區別在於,鍊錶和棧之間的對變數生命週期的管理不一樣;

在實現棧的過程中,我們不可避免的用到了鍊錶的api函式;

//標頭檔案1:棧的標頭檔案,定義了資料型別和棧的api函式

#define _my_linkstack_h

typedef

void linkstack;

//把棧節點適配成煉表節點,新增進鍊表庫

linkstack*

linkstack_create()

;void

linkstack_destroy

(linkstack* stack)

;void

linkstack_clear

(linkstack* stack)

;int

linkstack_push

(linkstack* stack,

void

* item)

;void

*linkstack_pop

(linkstack* stack)

;void

*linkstack_top

(linkstack* stack)

;int

linkstack_size

(linkstack* stack)

;//int linkstack_capacity(linkstack* stack);

#endif

//標頭檔案2:單向鍊錶的標頭檔案,裡面主要宣告了鍊錶的api函式,在模擬棧的過程中,我們用到了鍊錶的api

#ifndef _mylinklist_h_

#define _mylinklist_h_

typedef

void linklist;

typedef

struct _tag_linklistnode

linklistnode;

linklist*

linklist_create()

;void

linklist_destroy

(linklist* list)

;void

linklist_clear

(linklist* list)

;int

linklist_length

(linklist* list)

;int

linklist_insert

(linklist* list, linklistnode* node,

int pos)

;linklistnode*

linklist_get

(linklist* list,

int pos)

;linklistnode*

linklist_delete

(linklist* list,

int pos)

;#endif

//c檔案1:鍊錶的api函式的實現

#include

#include

"linklist.h"

using namespace std;

typedef

struct _tag_linklist

tlinklist;

linklist*

linklist_create()

memset

(tmp,0,

sizeof

(tlinklist));

return tmp;

}void

linklist_destroy

(linklist* list)

free

(list)

;return;}

void

linklist_clear

(linklist* list)

tlist->header.next =

null

; tlist->length =0;

return;}

intlinklist_length

(linklist* list)

return tlist->length;

}int

linklist_insert

(linklist* list, linklistnode* node,

int pos)

for(i =

0; i < pos; i++

) node->next = pcur->next;

pcur->next = node;

tlist->length++

;return0;

}linklistnode*

linklist_get

(linklist* list,

int pos)

for(i =

0; i < pos; i++

)return pcur->next;

}linklistnode*

linklist_delete

(linklist* list,

int pos)

for(i =

0; i < pos; i++

) ret=pcur->next;

pcur->next = ret->next;

tlist->length--

;//free(ret);

return ret;

}//c檔案2:棧的api函式的實現

#include

using namespace std;

#include

"linkstack.h"

#include

"linklist.h"

//壓棧相當於不斷從棧的頭部插入元素,壓棧需要做乙個結構體,將棧節點適配成煉表節點插入到鍊錶庫中

typedef

struct _tag_linkstack

tlinkstack;

linkstack*

linkstack_create()

//棧的銷毀和清空涉及棧的生命週期

void

linkstack_destroy

(linkstack* stack)

void

linkstack_clear

(linkstack* stack)

return;}

intlinkstack_push

(linkstack* stack,

void

* item)

return ret;

}//相當於不斷從鍊錶的頭部刪除元素;

void

*linkstack_pop

(linkstack* stack)

item = tmp->item;

free

(tmp)

;//插入的時候手動在堆區分配了記憶體,將元素刪除之後需要將記憶體釋放,防止記憶體洩露

return item;

//將鍊錶節點轉換成棧節點返回;

}//獲取0號位置的元素;

void

*linkstack_top

(linkstack* stack)

return tmp->item;

}int

linkstack_size

(linkstack* stack)

//c檔案3:棧的上層應用函式的,即棧的測試框架

#include

using namespace std;

#include

"linkstack.h"

intmain()

//獲取棧的屬性

cout <<

"len: "

<<

linkstack_size

(stack)

<< endl;

cout <<

"top: "

<<*(

int*

)linkstack_top

(stack)

<< endl;

//元素出棧

/*while (linkstack_size(stack) > 0)

這裡遮蔽的原因是,在測試linkstack_destroy這個函式的時候,需要棧中有元素*/

cout <<

"*****"

<< endl;

linkstack_destroy

(stack)

;return0;

}

棧 鏈式棧的實現

一 2 對於棧而言,通常允許插入 刪除操作的一端被稱為棧頂 top 另一端被稱為棧底 buttom 3 從棧頂壓入元素稱為進棧 push 4 從棧頂刪除元素稱為出棧 pop 棧是一種先進後出的線性表.二 可以採用單鏈表來儲存棧中的所有元素,這種結構的棧被稱為鏈棧。對於鏈棧而言,棧頂元素不斷改變,程式...

實現鏈式棧

棧作為一種資料結構,它按照後進先出的原則儲存資料,只能在棧頂進行插入和刪除操作的特殊線性表。按照儲存方式不同,棧可以分為順序棧和鏈式棧。實現鏈式棧需要注意 1 採用鍊錶儲存結構 2 不需要預定義記憶體空間,不存在 鏈式棧滿 這種情況 3 解決了順序棧中沒有合理分配記憶體大小的難題。以下為具體實現 在...

鏈式棧的介面實現

1.棧的特點是 先進後出 2.鏈式棧沒有限定容量 maxsize 也就是棧可以容納的元素取決於記憶體分配。對特定的程式,用不同的方法實現,如還可以用陣列式的棧。3.實際上是乙個沒有頭節點的鍊錶,只不過對操作做了限定 4.把棧頂元素定為 鍊錶的第乙個節點,也就是頭指標指向的結點為棧頂,這樣在壓棧和出棧...