基於鏈式鍊錶的棧鏈式儲存的C風格實現

2022-01-11 23:53:17 字數 3266 閱讀 4855

鏈式鍊錶的標頭檔案與cpp檔案見前文

標頭檔案:

1

#ifndef _linkstack_h_

2#define _linkstack_h_34

5 typedef void

linkstack;6//

建立乙個棧

7 linkstack*linkstack_create();8//

刪除乙個棧

9void linkstack_destroy(linkstack*stack);

10//

清空乙個棧

11void linkstack_clear(linkstack*stack);

12//

入棧13

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

14//

出棧15

void* linkstack_pop(linkstack*stack);

16//

獲取棧頂元素

17void* linkstack_gettop(linkstack*stack);

18//

獲取棧的長度

19int linkstack_getsize(linkstack*stack);

2021

2223

#endif

cpp檔案:

1 #include "

linklist.h

"2 #include "

linkstack.h

"3 #include 45//

6//需要呼叫前邊的linklist.h7//

8using

namespace

std;9//

定義乙個抽象的棧節點模型

10//

也就是用鏈式鍊錶的抽象模型來儲存item 以便插入元素

11//

就像12

//struct temp

13//

;21 typedef struct

_tag_linkstacknode

22linkstacknode;

2728

//建立乙個棧 相當於建立乙個線性表

29 linkstack*linkstack_create()

3033

//刪除乙個棧 相當於刪除乙個線性表

34//

先清空乙個棧 再刪除乙個鍊錶

35void linkstack_destroy(linkstack*stack)

3641

//清空乙個棧 相當於清空乙個線性表

42//

注意元素都是動態分配的記憶體

43//

應該先把所有元素彈出,並釋放節點記憶體

44void linkstack_clear(linkstack*stack)

4550

while(linkstack_getsize(stack) > 0)51

54return;55

}56//入棧 == 向煉表頭插入元素

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

5871 memset(temp, 0, sizeof

(linkstacknode));

72//

將item 也就是所需要儲存的資訊傳遞給temp->item

73 temp->item =item;

74//

現在可以直接插入

75 ret = linklist_insert(stack, (linklistnode*)temp, 0

);76

//異常處理

77if (ret != 0)78

85return -2;86

}87return0;

88}89//

出棧90

void* linkstack_pop(linkstack*stack)

91100

101 item = _temp->item ;

102//

因為插入時已經分配了記憶體

103//

因此出棧時需要釋放,

104free

(_temp);

105return

item;

106}

107//

獲取棧頂元素

108void* linkstack_gettop(linkstack*stack)

109117

return temp->item;

118}

119//

獲取棧的長度

120int linkstack_getsize(linkstack*stack)

121124

125

測試函式:

1 #include 2 #include "

linkstack.h"3

using

namespace

std;45

6int

main ()717

//入棧

18for (i = 0; i < 5 ; i++)

1923

//顯示大小和棧頂元素

24 cout << "

size:

"<< linkstack_getsize(stack) <2526 cout << "

top:

"<< *((int *)linkstack_gettop(stack)) <2728

//出棧

29while(linkstack_getsize(stack) != 0)30

33//

入棧34 linkstack_push(stack, &a[1

]);35 cout << "

size:

"<< linkstack_getsize(stack) <36//

清空37

linkstack_clear(stack);

38 cout << "

after clear size:

"<< linkstack_getsize(stack) <39//

刪除乙個棧

40linkstack_destroy(stack);

4142 system("

pause");

43return0;

44}45

C 棧 鏈式儲存

ifndef my linkstack h define my linkstack h typedef void linkstack linkstack linkstack create void linkstack destroy linkstack stack void linkstack cl...

棧的鏈式儲存

線性表的順序儲存來模擬棧時,在尾部新增或者刪除元素,不會涉及到陣列的元素大量移動 用線性表的鏈式儲存來模擬棧的線性儲存,在頭部新增或刪除,不用從頭到尾遍歷 linkstack.h ifndef my linkstack h define my linkstack h typedef void lin...

鍊錶 06 鏈式棧

鏈式棧類 template class chainstack chainstack bool isempty const 判斷鏈式棧是否為空 type top const 取棧頂元素 void push const type e 向棧頂插入元素 void pop 刪除棧頂元素 void makeem...