棧相比於鍊錶,它是一種特殊的資料模型,兩者既有聯絡(通過鍊錶的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.把棧頂元素定為 鍊錶的第乙個節點,也就是頭指標指向的結點為棧頂,這樣在壓棧和出棧...