栈和队列篇·第三章·栈·链式存储其一

(省略午饭)
"窗外还是...(省略)",我自言自语到。
"下来是...",我翻开了书继续看起来:

链栈是以单链表作为栈的存储结构,单链表的第一个结点作为栈顶,最后一个结点作为栈底。链栈既可以是带头结点的链表也可以是不带头结点的链表。
注意:栈通常由栈顶指针top进行标识,若无头结点的链栈,栈顶指针直接指向栈顶结点;对于由头结点的链栈,栈顶指针指向头结点。表示如下:

typedef struct node{
    Elemtype data;//数据域
    struct node *next;//指针域
}StackNode,*LinkStack;

//图示后加1.16
链栈就是一个限定只能在表头进行push,pop操作的链表,基本操作无异与链表。

以下为带头结点的链表的部分:

获取栈顶元素
int GetTop(LinkStack top){
    if(!top)return 0;//无效判定
    if(!top->next)return 0;//栈空
    cout<<top->next->data;//取得
}

实质为获取链表第一个结点(由栈顶指针的next域表示)的数据元素。

元素入栈

和顺序栈不同的是,在链表中将e入栈,并不需要判断是否已满,只需要生成一个包含元素e的新结点,并将新结点插入到链表的第一个位置(即栈顶)即可

int pushStack(LinkStack top,Elemtype e){
    StackNode *s;
    if(!top)return 0;//链栈无效
    s=(StackNode*)malloc(sizeof(StackNode));
    if(!s)return 0;//内存分配错误
    s->data=e;//将数据放到新结点的数据域
    s->next=top->next;//将s插入到栈顶
    top->next=s;
    return 1;
}
元素出栈

首先是判断栈空,在不为空的前提下进行出栈:

int popStack(LinkStack top){
    StackNode *s;
    if(!top)return 0;//链栈无效
    if(!top->next)return 0;//栈空
    cout<<top->next->data<<endl;
    s=top->next;//s指向栈顶结点
    top->next=s->next;//删除栈顶结点
    free(s);//释放
    return 1;
}

对于其应用,将在后续示出...to be continue...

//1.16

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容