基于链式链表的栈链式存储的C风格实现

链式链表的头文件与CPP文件见前文

头文件:

 1 #ifndef _LINKSTACK_H_
 2 #define _LINKSTACK_H_
 3  
 4  
 5 typedef void LinkStack;
 6 //创建一个栈
 7 LinkStack* LinkStack_Create();
 8 //删除一个栈
 9 void LinkStack_Destroy(LinkStack* stack);
10 //清空一个栈
11 void LinkStack_Clear(LinkStack* stack);
12 //入栈
13 int LinkStack_Push(LinkStack* stack, void* item);
14 //出栈
15 void* LinkStack_Pop(LinkStack* stack);
16 //获取栈顶元素
17 void* LinkStack_GetTop(LinkStack* stack);
18 //获取栈的长度
19 int LinkStack_GetSize(LinkStack* stack);
20  
21  
22  
23 #endif

CPP文件:

  1 #include "linkList.h"
  2 #include "linkStack.h"
  3 #include <iostream>
  4  
  5 //
  6 //需要调用前边的LinkList.H
  7 //
  8 using namespace std;
  9 //定义一个抽象的栈节点模型 
 10 //也就是用链式链表的抽象模型来存储item 以便插入元素
 11 //就像
 12 //struct TEMP
 13 //{
 14 //    LinkListNode node;
 15 //    int a;
 16 //    char b;
 17 //    float c;
 18 //    ......
 19 //    这样的数据结构
 20 //};
 21 typedef struct _tag_LinkstackNode
 22 {
 23     LinkListNode node;
 24     void* item;
 25  
 26 }LinkStackNode;
 27  
 28 //创建一个栈  相当于创建一个线性表
 29 LinkStack* LinkStack_Create()
 30 {
 31     return LinkList_Create();
 32 }
 33 //删除一个栈 相当于删除一个线性表
 34 //先清空一个栈 再删除一个链表
 35 void LinkStack_Destroy(LinkStack* stack)
 36 {
 37     LinkStack_Clear(stack);
 38     LinkList_Destory(stack);
 39     return;
 40 }
 41 //清空一个栈  相当于清空一个线性表
 42 //注意元素都是动态分配的内存
 43 //应该先把所有元素弹出,并释放节点内存
 44 void LinkStack_Clear(LinkStack* stack)
 45 {
 46     if (stack == NULL)
 47     {
 48         return;
 49     }
 50     while(LinkStack_GetSize(stack) > 0)
 51     {
 52         LinkStack_Pop(stack);  
 53     }
 54     return;
 55 }
 56 //入栈 == 向链表头插入元素
 57 int LinkStack_Push(LinkStack* stack, void* item)
 58 {
 59     int ret = 0;
 60     //先定义一个临时LinkStackNode指针变量temp
 61     LinkStackNode* temp = NULL;
 62     //现在是想存储temp的
 63     //为了防止函数结束时temp被析构必须分配内存
 64     temp = (LinkStackNode*)malloc(sizeof(LinkStackNode));
 65     //异常处理
 66     if (temp == NULL)
 67     {
 68         cout << "Push Temp Err" << endl;
 69         return -1;
 70     }
 71     memset(temp, 0, sizeof(LinkStackNode));
 72     //将item 也就是所需要存储的信息传递给temp->item
 73     temp->item = item;
 74     //现在可以直接插入
 75     ret = LinkList_Insert(stack, (LinkListNode*)temp, 0);
 76     //异常处理
 77     if (ret != 0)
 78     {
 79         cout << "Fucn Insert Err" << endl;
 80         //为了防止内存插入失败而导致内存泄漏
 81         if (temp != NULL)
 82         {
 83             free(temp);
 84         }
 85         return -2;
 86     }
 87     return 0;
 88 }
 89 //出栈
 90 void* LinkStack_Pop(LinkStack* stack)
 91 {
 92     //定义一个中间缓存
 93     void* item = NULL;
 94     LinkStackNode* _temp = NULL; //定义一个框架
 95     _temp = (LinkStackNode*)LinkList_Delete(stack, 0);
 96     if (_temp == NULL)
 97     {
 98         return NULL;
 99     }
100  
101     item = _temp->item ;
102     //因为插入时已经分配了内存
103     //因此出栈时需要释放,
104     free(_temp);
105     return item;
106 }
107 //获取栈顶元素
108 void* LinkStack_GetTop(LinkStack* stack)
109 {
110     LinkStackNode* temp = NULL; //定义一个框架
111     temp = (LinkStackNode*)LinkList_Get(stack, 0);
112     if (temp == NULL)
113     {
114         cout << "GetTOP ERR (temp = NULL) " << endl;
115         return NULL;
116     }
117     return temp->item;
118 }
119 //获取栈的长度
120 int LinkStack_GetSize(LinkStack* stack)
121 {
122     return LinkList_Length(stack);
123 }
124  
125  

测试函数:

 1 #include <iostream>
 2 #include "linkStack.h"
 3 using namespace std;
 4  
 5  
 6 int main ()
 7 {
 8     int i = 0;
 9     int a[10];
10  
11     LinkStack* stack = NULL;
12     stack = LinkStack_Create();
13     if(stack == NULL)
14     {
15         return -1;
16     }
17     //入栈
18     for (i = 0; i < 5 ; i++)
19     {
20         a[i] = i + 1;
21         LinkStack_Push(stack, &a[i]);
22     }
23     //显示大小和栈顶元素
24     cout << "Size: " << LinkStack_GetSize(stack) << endl;
25  
26     cout << "Top: "  << *((int *)LinkStack_GetTop(stack)) << endl;
27  
28     //出栈
29     while(LinkStack_GetSize(stack) != 0)
30     {
31         cout << "Pop: "  << *((int *)LinkStack_Pop(stack)) << endl;
32     }
33     //入栈
34     LinkStack_Push(stack, &a[1]);
35     cout << "Size: " << LinkStack_GetSize(stack) << endl;
36     //清空
37     LinkStack_Clear(stack);
38     cout << "After Clear Size: " << LinkStack_GetSize(stack) << endl;
39     //删除一个栈
40     LinkStack_Destroy(stack);
41  
42     system("pause");
43     return 0;
44 }
45  

猜你喜欢

转载自www.cnblogs.com/Lxk0825/p/9519946.html