线性数据结构——链栈

链栈

  个人认为,简单形容栈就是只有一个头能进出。first in last out相信不是很难理解的问题,在这里主要讲一讲链栈。

  首先链栈同样是栈,当然也是filo的。

  链栈是指采用链接存储的结构实现的栈。事实上链栈和链表的样子很像。

                                                                            

  其中data为数据,next为下一个数据的指针

class LinkStack
{
    datatype data;
    LinkStack *next;
}

  LinkStack就是就是这样的数据类型。LinkStack t,*S=&t;。然后使用S->data描述该点元素的值,S->next来描述该节点逻辑后继值的存储地址。

  由于链栈不存在栈满的情况,所以不需要像正常的顺序栈一样判断是否栈满。对链栈的操作同样有以下几类:置空栈,判空栈,判满栈,取栈顶元素,入栈,出栈。

链栈置空算法

LinkStack * SetStack()
{
    LinkStack *LS;
    LS=NULL;
    return LS;
}

 

链栈判断空算法

int StackEmpty(LinkStack *LS)//空时返回1,不空返回0
{
    if(LS==NULL)
    return 1;
    else
    return 0;
}

 

链栈取顶算法

datatype GetTop(LinkStack *LS)
{
    if(LS!=NULL)
        return LS->data;
    else
        cout<<"栈空";
}


链栈入栈算法

在栈顶插入值为x的元素存放在一个新创建的LinkStack的data中。原本的LS与新创建的LinkStack的next相等。然后LS与原来的首元素断开,与x连接。如图:

LinkStack *Push(LinkStack *LS,datatype x)
{
    LinkStack *p;
    p=(LinkStack *)malloc(sizeof(LinkStack))
    p->data=x;
    p->next=LS;
    LS=p;
    return LS;
}


链栈出栈算法

首先将创建一个新的LinkStack  *pop,不需要分配内存空间。直接将pop指向出栈data,LS指向pop的next空间。然后断开LS原本指向pop中data。

LinkStack *POP(LinkStack *LS)
{
    LinkStack *poptem;
    poptem=LS;
    LS=poptem->next;
    free(poptem);
    return LS;
}

 具体链栈和链表的区别,后面会讲到。

posted @ 2017-09-09 14:53  newen  阅读(2227)  评论(0编辑  收藏  举报