一个简单的C stack实现
用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 mystack { struct mystack * _this; //this ElementType * bottom; //栈底指针 ElementType * top; //栈顶指针 int size; //栈大小 Bool (*freeStack)(); Bool (*push)(ElementType data); Bool (*pop)(ElementType *outputData); Bool (*isEmpty)(); void (*makeStackEmpty)(); void (*print)(); } MyStack; MyStack * initStack( int size); //初始化 Bool freeStack(); //释放内存 Bool push(ElementType data); Bool pop(ElementType * outputData); Bool isEmpty(); void makeStackEmpty(); void print(); #endif
//mystack.c #include "mystack.h" MyStack * initStack( int size); //初始化 Bool freeStack(); //释放内存 Bool push(ElementType data); Bool pop(ElementType * outputData); Bool isEmpty(); void makeStackEmpty(); void print(); MyStack* stack = NULL; MyStack* initStack( int size) { 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; //初始化大小 stack->freeStack = freeStack; stack->push = push; stack->pop = pop; stack->isEmpty =isEmpty; stack->makeStackEmpty = makeStackEmpty; stack->print = print; stack->_this = stack; return stack; } Bool freeStack() { if(stack->_this!=NULL) { free(stack->_this->bottom); free(stack->_this); return 1; } else { return 0; } } void makeStackEmpty() { if(stack->_this!=NULL) stack->_this->top = stack->_this->bottom; } Bool isEmpty() { if(stack->_this != NULL) { if(stack->_this->bottom == stack->_this->top) return 1; else return 0; } else return 0; } Bool push(ElementType data) { if(stack->_this->top - stack->_this->bottom >= stack->_this->size) { stack->_this->bottom = (ElementType*)realloc(stack->_this->bottom, sizeof(ElementType*)*(stack->_this->size + MYSTACK_INCREASE_NUM)); if(stack->_this->bottom == NULL) return 0; stack->_this->top = stack->_this->bottom + stack->_this->size; stack->_this->size += MYSTACK_INCREASE_NUM; } *(stack->_this->top)=data; //先存值 stack->_this->top++; //指针加1,指向下一内存单元 return 1; } Bool pop(ElementType * outputData) { if(isEmpty()) { printf("stack is empty\n"); return 0; } stack->_this->top--; //指针减1后指向栈中最顶上的元素 *outputData = *(stack->_this->top); //取值 return 1; } void print() { if(stack->_this!= NULL) { if(stack->_this->bottom == stack->_this->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->_this->bottom; for(;element != stack->_this->top ; element++) printf("%d\n",*element); } } }
#include "mystack.h" #include <stdio.h> int main(int argc, char const *argv[]) { /* code */ int a,b,c; MyStack* stack = initStack(2); stack->push(1); stack->push(2); stack->print(); //预期输出 1 、2 stack->push(3); stack->print(); //预期输出 1、2、3 stack->pop(&a); stack->pop(&b); stack->push(4); stack->pop(&c); printf("a=%d b=%d c=%d\n",a,b,c ); //预期输出 a=3 b=2 c=4 stack->makeStackEmpty(); stack->pop(&a); //预期输出 stack is empty printf("a=%d\n", a); //预期输出 a=3 stack->freeStack(); return 0; }
参考 : 百度文库
http://blog.csdn.net/mci2004/article/details/7532205