链式链表的头文件与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