栈的特点是先进后出也就是所谓的FILO,栈这种数据结构在函数中运用很多,在函数调用时,调用函数需要先将本身的数据保存
到内存空间中,而被函数的参数也需要从内存空间中读取出来,这两个过程就是一个进栈一个出栈,根据物理存储结构栈可以分为:
1、顺序栈,2、链表栈。
下面是用c实现的顺序栈
//堆栈 定义栈空间节点数据类型 typedef struct{ char c; int i; }DataStruct; //定义栈结构 包括栈顶指针,栈地指针 //关键点:判断栈满的条件:top-bottom>=size;当栈顶指针减去栈底指针大于初始化的栈长度 // 判断栈空:top总是指向下一个栈空间,如果top==botttom说明栈空。 typedef struct{ DataStruct* top; DataStruct* bottom; int size; } Stack; int initStack(Stack* s,int size) { s->bottom = (DataStruct*)malloc(size*sizeof(DataStruct)); s->top = s->bottom; //初始化栈空间,此时栈空所以要将top指向bottom同一个位置 s->size = size; //保存栈空间大小 if(s!=NULL){ return -1; }else{ return 0; } } //进栈 int push(Stack* s,DataStruct data){ //进栈判断栈满 //注意指针的加减法:top - bottom 而不是指针的地址相减。 //另外结构体指针访问结构体内变量的操作语法是 s->top,而基本数据类型指针操作语法是 s.top; if((s->top-s->bottom)>=s->size){ //可以重新分配空间 return -1; } *s->top = data;
s->top++; return 0; } //出栈 int pop(Stack* s,DataStruct* data){ //判断栈空 if(s->top == s->bottom){ printf("栈已空 "); return -1; } s->top--; *data = *s->top;
return 0; } void main(int argc, char *argv[]) { Stack stack; DataStruct ds = {'c',100}; DataStruct temp; initStack(&stack,100); push(&stack,ds); push(&stack,ds); push(&stack,ds); push(&stack,ds); pop(&stack,&temp); printf("%c,%d ",temp.c,temp.i); pop(&stack,&temp); printf("%c,%d ",temp.c,temp.i); pop(&stack,&temp); printf("%c,%d ",temp.c,temp.i); pop(&stack,&temp); printf("%c,%d ",temp.c,temp.i); pop(&stack,&temp); system("pause"); }