C语言栈的实现
栈是常用的数据结构之一,下面给出一个链式栈的实现~~
头文件Stack.h
#ifndef Stack_H #define Stack_H typedef int Item; typedef struct node * PNode; /*定义栈节点类型*/ typedef struct node { Item data; PNode down; }Node; /*定义栈类型*/ typedef struct stack { PNode top; int size; }Stack; /*构造一个空栈*/ Stack *InitStack(); /*销毁一个栈*/ void DestroyStack(Stack *ps); /*把栈置空*/ void ClearStack(Stack *ps); /*判定是否为空栈*/ int IsEmpty(Stack *ps); /*返回栈大小*/ int GetSize(Stack *ps); /*返回栈顶元素*/ PNode GetTop(Stack *ps,Item *pitem); /*元素入栈*/ PNode Push(Stack *ps,Item item); /*元素出栈*/ PNode Pop(Stack *ps,Item *pitem); /*遍历栈并访问visit函数*/ void StackTraverse(Stack *ps,void (*visit)()); #endif
实现部分Stack.c:
1 #include"Stack.h" 2 #include<malloc.h> 3 #include<stdlib.h> 4 /*构造一个空栈*/ 5 Stack *InitStack() 6 { 7 Stack *ps = (Stack *)malloc(sizeof(Stack)); 8 if(ps!=NULL) 9 { 10 ps->top = NULL; 11 ps->size = 0; 12 } 13 return ps; 14 } 15 16 /*判定是否为空栈*/ 17 int IsEmpty(Stack *ps) 18 { 19 if(ps->top == NULL && ps->size == 0) 20 return 1; 21 else 22 return 0; 23 } 24 25 /*返回栈大小*/ 26 int GetSize(Stack *ps) 27 { 28 return ps->size; 29 } 30 31 /*元素入栈*/ 32 PNode Push(Stack *ps,Item item) 33 { 34 PNode pnode = (PNode)malloc(sizeof(Node)); 35 if(pnode != NULL) 36 { 37 pnode->data = item; 38 pnode->down = GetTop(ps,NULL); 39 ps->size++; 40 ps->top = pnode; 41 42 } 43 return pnode; 44 } 45 46 /*返回栈顶元素*/ 47 PNode GetTop(Stack *ps,Item *pitem) 48 { 49 if(IsEmpty(ps)!=1&&pitem!=NULL) 50 { 51 *pitem = ps->top->data; 52 } 53 return ps->top; 54 } 55 56 57 /*元素出栈*/ 58 PNode Pop(Stack *ps,Item *pitem) 59 { 60 PNode p = ps->top; 61 if(IsEmpty(ps)!=1&&p!=NULL) 62 { 63 if(pitem!=NULL) 64 *pitem = p->data; 65 ps->size--; 66 ps->top = ps->top->down; 67 free(p); 68 } 69 return ps->top; 70 } 71 72 /*销毁一个栈*/ 73 void DestroyStack(Stack *ps) 74 { 75 if(IsEmpty(ps)!=1) 76 ClearStack(ps); 77 free(ps); 78 } 79 80 /*把栈置空*/ 81 void ClearStack(Stack *ps) 82 { 83 while(IsEmpty(ps)!=1) 84 { 85 Pop(ps,NULL); 86 } 87 } 88 89 /*遍历栈并访问visit函数 */ 90 void StackTraverse(Stack *ps,void (*visit)()) 91 { 92 PNode p = ps->top; 93 int i = ps->size; 94 while(i--) 95 { 96 visit(p->data); 97 p = p->down; 98 } 99 }
测试部分Test.c:
1 #include"Stack.h" 2 #include<stdio.h> 3 void print(Item i) 4 { 5 printf("该节点元素为%d\n",i); 6 } 7 main() 8 { 9 Stack *ps = InitStack(); 10 int i,item; 11 12 printf("0-9依次入栈并输出如下:\n"); 13 for(i=0;i<10;i++) 14 { 15 Push(ps,i); 16 GetTop(ps,&item); 17 printf("%d ",item); 18 } 19 20 printf("\n从栈顶到栈顶遍历并对每个元素执行print函数:\n"); 21 StackTraverse(ps,print); 22 23 printf("栈中元素依次出栈并输出如下:\n"); 24 for(i=0;i<10;i++) 25 { 26 Pop(ps,&item); 27 printf("%d ",item); 28 } 29 30 ClearStack(ps); 31 if(IsEmpty(ps)) 32 printf("\n将栈置空成功\n"); 33 DestroyStack(ps); 34 printf("栈已被销毁\n"); 35 36 }