栈的特点是先进后出也就是所谓的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("栈已空\r\n"); 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\r\n",temp.c,temp.i); pop(&stack,&temp); printf("%c,%d\r\n",temp.c,temp.i); pop(&stack,&temp); printf("%c,%d\r\n",temp.c,temp.i); pop(&stack,&temp); printf("%c,%d\r\n",temp.c,temp.i); pop(&stack,&temp); system("pause"); }

 

posted @ 2016-09-28 10:02  麦哈顿博士  阅读(318)  评论(0编辑  收藏  举报