3.1.3 栈的链式存储实现

辛苦手码不易, 如若有帮助烦请不吝收藏点赞 😃


张大壮考研碎碎念

主要是自己的408考研笔记, 因为WD的网课和书里会有不少需要自己动手写代码的部分, 所以就在这里予以记录, 不定时更新, 希望各位大牛不吝批评指正

数据结构

CH 3.1.3 栈的链式存储实现

这里WD书仅仅给出了链栈的定义方式, 要求学生参照对比单链表的形式给出实现方法, 这里实现如下:

//链栈的定义
typedef struct Linknode {
    int data;//数据域
    struct Linknode* next;//指针域
} *LiStack;//栈类型定义
/*********以下为带头节点*******************************************/
//链栈初始化
LiStack InitLiStack() {
    LiStack L = (LiStack)malloc(sizeof(Linknode));// 创建头节点
    L->next = NULL;//初始为空链表
    return L;
}
//Push
bool PushLiStack(LiStack& L, int e) {
    if (L == NULL)
        return false;
    LiStack S = (LiStack)malloc(sizeof(Linknode));
    if (S == NULL)
        return false;
    S->data = e;
    S->next = L->next;
    L->next = S;
    return true;
}
//Pop
bool PopLiStack(LiStack& L,int &e) {
    if (L == NULL)
        return false;
    if (L->next== NULL)
        return false;
    if (L->next->next == NULL) {
        e = L->next->data;
        L->next=NULL;
        free(L->next);
        return true;
    }
    else{
        LiStack p = L->next;
        e = p->data;
        L->next = p->next;
        free(p);
        return true;
    }
}
//读取栈顶元素
bool GetTop(LiStack L,int &e) {
    if (L == NULL)
        return false;
    if (L->next== NULL)
        return false;
    e = L->next->data;
    return true;
}
//判空
bool IsEmpty(LiStack L){
    if (L == NULL)
        return false;
    if (L->next== NULL)
        return false;
    else
        return true;
}
//判满,本来就是链表的形式,如若不在头节点的data里计数的话,就只能靠遍历来获取节点数目了,那样就变成链表了,在这里判满无意义

/*****************以下为不带头结点(王道推荐)***************/
//链栈的定义
typedef struct Linknode {
    int data;//数据域
    struct Linknode* next;//指针域
} *LiStack;//栈类型定义

//Push
bool PushLiStack(LiStack& top, int e) {
    //assert(top);//限制头指针要么指向NULL,要么不为NULL
    LiStack S = (LiStack)malloc(sizeof(Linknode));//创建新节点
    if (S == NULL)
        return false;
    LiStack cur=top;
    S->data = e;
    S->next = cur;
    top = S;
    return true;
}

//Pop
bool PopLiStack(LiStack& top,int &e) {
    if (top == NULL)
        return false;
    if (top->next == NULL) {
        free(top);
        top=NULL;
        return true;
    }
    else {
        LiStack p = top;
        e = p->data;
        top = p->next;
        free(p);
        p=NULL;
        return true;
    }
}
//读取栈顶元素
bool GetTop(LiStack top,int &e) {
    if (top == NULL){
        return false;
	}	
    else
    	e = top->data;
    return true;
}
//判空
bool IsEmpty(LiStack top){
    if (top == NULL)
        return false;
    else
        return true;
}
void test(){
    LiStack top = NULL;
    PushLiStack(top, 1);
}

相较而言, WD推荐的不带头结点的实现方法确实是更加简单, 但是我个人实现起来, 会更加中意带头结点的实现方式, 感觉逻辑会更加清楚一些


代码若有谬误或是能更加精简的地方还请大家不吝指正 😃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Autumn_begins

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值