标签:
用C语言实现了一个简单的栈。基本思路是定义一个栈结构体,里面有两个指针和一个表示栈大小的int。两个指针分别指向栈底和栈顶,当栈底指针和栈顶指针重合时,说明栈为空;当栈顶指针减去栈底指针的值大于等于栈的大小,说明栈已满。
//mystack.h #ifndef mystack_H #define mystack_H #include <stdio.h> #include <stdlib.h> #define MYSTACK_INCREASE_NUM 2 typedef int ElementType; //暂定为int typedef int Bool; typedef struct { ElementType * bottom; //栈底指针 ElementType * top; //栈顶指针 int size; //栈大小 } MyStack; MyStack * initStack( int size); //初始化 Bool freeStack(MyStack * stack); //释放内存 Bool push(MyStack * stack, ElementType data); Bool pop(MyStack *stack, ElementType * outputData); Bool isEmpty(MyStack *stack); void makeStackEmpty(MyStack *stack); void printStack(MyStack *stack); #endif
//mystack。c #include "mystack.h" MyStack* initStack( int size) { MyStack* stack = (MyStack*)malloc(sizeof(MyStack)); //分配内存 if(stack==NULL) return NULL; stack->bottom = (ElementType*)malloc(sizeof(ElementType)*size); if(stack->bottom == NULL) return NULL; stack->top = stack->bottom; //初始化为空栈 栈顶指针和栈底指针指向同一位置 stack->size = size; //初始化大小 return stack; } Bool freeStack(MyStack * stack) { if(stack!=NULL) { free(stack->bottom); free(stack); return 1; } else { return 0; } } void makeStackEmpty(MyStack *stack) { if(stack!=NULL) stack->top = stack->bottom; } Bool isEmpty(MyStack *stack) { if(stack != NULL) { if(stack->bottom == stack->top) return 1; else return 0; } else return 0; } Bool push(MyStack * stack, ElementType data) { if(stack->top - stack->bottom >= stack->size) //栈满 { stack->bottom = (ElementType*)realloc(stack->bottom, //分配内存,增加栈大小 sizeof(ElementType*)*(stack->size + MYSTACK_INCREASE_NUM)); if(stack->bottom == NULL) return 0; stack->top = stack->bottom + stack->size; //初始化栈顶指针 stack->size += MYSTACK_INCREASE_NUM; } *(stack->top)=data; //先存值 stack->top++; //指针加1,指向下一内存单元 return 1; } Bool pop(MyStack *stack, ElementType * outputData) { if(isEmpty(stack)) { printf("stack is empty\n"); return 0; } stack->top--; //指针减1后指向栈中最顶上的元素 *outputData = *(stack->top); //取值 return 1; } void printStack(MyStack *stack) { if(stack!= NULL) { if(stack->bottom == stack->top) { printf("stack is empty\n"); } else { /*for(int i = 0 ; i < stack->top - stack->bottom ; i++) printf("%d\n",stack->bottom[i] );*/ ElementType * element = stack->bottom; for(;element != stack->top ; element++) printf("%d\n",*element); } } }
//stacktest.c #include "mystack.h" #include <stdio.h> int main(int argc, char const *argv[]) { /* code */ int a,b,c; MyStack* stack = initStack(2); push(stack,1); push(stack,2); printStack(stack); //预期输出 1 、2 push(stack,3); printStack(stack); //预期输出 1、2、3 pop(stack,&a); pop(stack,&b); push(stack,4); pop(stack,&c); printf("a=%d b=%d c=%d\n",a,b,c ); //预期输出 a=3 b=2 c=4 makeStackEmpty(stack); pop(stack,&a); //预期输出 stack is empty printf("a=%d\n", a); //预期输出 a=3 freeStack(stack); return 0; }
参考 : 百度文库
http://blog.csdn.net/mci2004/article/details/7532205
标签:
原文地址:http://www.cnblogs.com/Zhang-Shangyu/p/5475526.html