栈的链式实现(C语言)

来源:互联网 发布:我的世界java版 编辑:程序博客网 时间:2024/05/01 18:49

栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。在表中,允许插入和删除的一端称作“栈顶(top)”,不允许插入和删除的另一端叫作“栈底(bottom)”。通常称往栈顶插入元素的操作为“入栈”,称删除栈顶元素的操作为“出栈”。因为后入栈的元素先于先入栈的元素出栈,故被称为是一种“后进先出”的结构,因此又称 LIFO 表(Last In First Out的缩写)。

和线性表类似,栈也有两种存储表示:顺序栈和链栈。下面仅介绍栈的链式存储实现。

栈的定义:

typedef struct node     //栈的结点结构{    int data;    struct node *next;}L,*Link;typedef struct{     //栈顶作链表的头部    Link  top;}S,*Stack;

初始化

Stack init_stack(){    Stack s;    s=(Stack )malloc (sizeof(S ));    if(s) s->top =NULL;    return s;}

入栈
int push_stack(Stack s,int x){    Link  p;    p=(Link  )malloc (sizeof(L));    if(!p)    {        printf("内存溢出");        return 0;    }    p->data =x;    p->next =s->top ;       //将新结点插入到栈顶位置    s->top =p;      //栈顶指针指向最新的结点    return 1;}

如上图,在入栈两个结点后,栈顶指针指向最新入栈的结点a2,同时结点a2的指针域指向下一个结点,最先入栈的结点指针域为空。

出栈

int pop_stack(Stack s,int &x){    Link  p;    if(s->top ==NULL)    {        printf("栈空");        return 0;    }    x=s->top ->data ;    p=s->top ;    s->top=s->top ->next ;      //出栈后,栈顶指针指向下一个结点    free(p);    return 1;}

销毁栈

void destroy_stack(Stack &s){    Link p,q;    if(s)    {        p=s->top ;        while(p)        {            q=p;            p=p->next ;            free(q);        }        free(s);    }    s=NULL;    return;}

1 0
原创粉丝点击