代码模版
/************************************************************************* > File Name: stack.h > Author: zhoulin > Mail: 715169549@qq.com > Created Time: Tue Mar 29 11:50:33 2016 ************************************************************************/ #ifndef _STACK_H #define _STACK_H #include <stddef.h> typedef unsigned char bool; #define true 1 #define false 0 //define a element of stack typedef struct _SElemType{ unsigned char f:1; void *data; struct _SElemType *next; }SElemType; //define a Stack typedef struct _Stack { int size; int free; struct _SElemType *top; struct _SElemType *bottom; }Stack; //init opertion #define ResetStack(S) \ { \ S->size = S->free = 0; \ S->top = NULL; \ S->bottom = NULL; \ } #define ResetSElemType(E) \ { \ E->f = 0; \ E->data = NULL; \ E->next = NULL; \ } //init a Stack Stack *InitStack(); //destroy a Stack and free all memeory void DestroyStack(Stack *s); //clear all stack and reset all f void ClearStack(Stack *s); //judge a stack of size is equeal zero bool StackEmpty(Stack *s); //get a length of stack int StackLength(Stack *s); //push a data into stack int StackPush(Stack *s,void *data,size_t n); //pop a data out of stack int StackPop(Stack *s); //get top element of stack SElemType *StackTop(Stack *s); //get bottom element of stack SElemType *StackBottom(Stack *s); #endif
/************************************************************************* > File Name: stack.c > Author: zhoulin > Mail: 715169549@qq.com > Created Time: Tue Mar 29 12:16:16 2016 ************************************************************************/ #include "stack.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stddef.h> Stack *InitStack() { Stack *s = NULL; if((s = (Stack *)malloc(sizeof(*s))) == NULL) { return NULL; } ResetStack(s); return s; } void DestroyStack(Stack *s) { if(s != NULL && s->size > 0) { SElemType *cur = s->top; while(cur != NULL) { SElemType *ncur = cur->next; free(cur->data); cur = ncur; } free(s); s = NULL; } } bool StackEmpty(Stack *s) { if(s != NULL && s->size > 0) { return true; } return false; } int StackLength(Stack *s) { if(s != NULL){ return s->size; } return -1; } int StackPush(Stack *s,void *data,size_t n) { if(s != NULL) { SElemType *cur =(SElemType *)malloc(sizeof(SElemType)); ResetSElemType(cur); cur->data = (char *)malloc(n); bzero(cur->data,n); if(cur == NULL || cur->data == NULL) { free(cur); free(cur->data); cur = cur->data = NULL; return -1; } cur->f = 1; memcpy(cur->data,data,n); if(s->size == 0) { s->top = s->bottom = cur; s->size++; return 0; } s->bottom->next = cur; s->bottom = cur; s->size++; return 0; } return -1; } int StackPop(Stack *s) { if(s != NULL && s->size > 0) { SElemType *bottom = s->bottom; SElemType *cur = s->top; SElemType *tmp = NULL; while(cur != NULL) { SElemType *ncur = cur->next; if(ncur != NULL && ncur == bottom) { tmp = ncur; break; } } if(tmp == NULL) { return -1; } free(cur->data); free(cur); cur->next = cur->data = NULL; tmp->next = NULL; s->bottom = tmp; s->size--; if(s->size == 1) { s->top =s->bottom; } return 0; } return -1; } SElemType *StackTop(Stack *s) { if(s == NULL || s->size == 0) { return NULL; } return s->top; } SElemType *StackBottom(Stack *s) { if(s == NULL || s->size == 0) { return NULL; } return s->bottom; } static void StackPrt(Stack *s) { if(s != NULL && s->size > 0) { SElemType *cur = s->top; fprintf(stdout,"top=%p,bottom =%p\n",s->top,s->bottom); while(cur != NULL) { fprintf(stdout," cur = %p,next =%p,f=%d,data=%p\n",cur,cur->next,cur->f,cur->data); cur = cur->next; } } } int main(void) { Stack *s = InitStack(); char *s1 = "abc"; int s2 =100; int s3 =99; char *s4 = "hello"; fprintf(stdout,"StackPush(%s,%d) =%d\n",s1,strlen(s1)+1,StackPush(s,s1,strlen(s1)+1)); fprintf(stdout,"StackPush(%d,%d) =%d\n",s2,sizeof(int),StackPush(s,&s2,sizeof(int))); fprintf(stdout,"StackPush(%s,%d) =%d\n",s4,strlen(s4)+1,StackPush(s,s4,strlen(s4)+1)); fprintf(stdout,"StackPush(%d,%d) =%d\n",s3,sizeof(int),StackPush(s,&s3,sizeof(int))); StackPrt(s); DestroyStack(s); return 0; }