追梦之旅【数据结构篇】——详解C语言实现链栈
创始人
2024-05-26 17:37:54
0

详解C语言实现链栈~😎

  • 前言🙌
  • 整体实现内容分析💞
    • 1.头文件编码实现🙌
    • 2.功能文件编码实现🙌
    • 3.测试函数功能代码🙌
  • 总结撒花💞

追梦之旅,你我同行

   
😎博客昵称:博客小梦
😊最喜欢的座右铭:全神贯注的上吧!!!
😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!

😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
在这里插入图片描述

前言🙌

    哈喽各位友友们😊,我今天又学到了很多有趣的知识现在迫不及待的想和大家分享一下!😘我仅已此文,手把手带领大家详解C语言实现链栈~ 要是为了运用所学的链表的相关知识和算法。用代码来实现链栈,也就是用链表来实现栈。都是精华内容,可不要错过哟!!!😍😍😍

整体实现内容分析💞

在使用链表来实现链栈时,可以针对栈只在栈顶上后进先出的特点,找什么样的链表实现比较好。我通过比较后觉得采用单链表的结构,然后链表的首节点放在栈顶上。后面只需对首节点进行插入和删除即可。首先建立链表结构体,然后建立队列结构体,里面定义一个指向链表首节点的指head。然后依次实现栈的初始化,销毁,入栈,出栈,取栈顶元素,判断栈是否为空,栈上的元素个数,遍历栈上元素等这些基本功能

1.头文件编码实现🙌

头文件的编写的整体思路分析:

这里是有关头文件的编写和各种功能函数的声明,首先用typedef关键字给存储数据类型取别名,这样做的好处是以后想要改变栈的数据类型只需修改typedef int StDatetype;里的int即可。定义两个结构体,一个是链表的,一个是栈的。

#pragma once
#include
#include
#include
#includetypedef int StDatetype;
typedef struct StackNode
{struct StackNode* next;StDatetype data;}ST;
typedef struct Stack
{ST* head;}Stack;//初始化void StackInit(ST* ps);
//销毁
void StackDestory(ST* ps);
//入栈
void StackPush(ST* ps, StDatetype x);
//出栈
void StackPop(ST* ps);
//栈上的数据个数
int  StackSize(ST* ps);
//栈顶元素
StDatetype StackTop(ST* ps);
//判空
bool StackEmpty(ST* ps);

2.功能文件编码实现🙌

功能文件的编写的整体思路分析:

这里是功能文件的编写,在涉及到指针的地方,我都用了assert确保指针有效性,在free掉指针时,需要把指针置为空指针,避免野指针的问题。第一个是初始化函数,第二个是销毁函数实现。其中需要注意的是入栈和出栈的编写。入栈时,先用malloc函数动态申请一个空间,然后判断以下有没有开辟成功。需要注意的是,需要把newnode置为NULL,防止野指针的问题出现。然后将newnode的next指针指向head,然后让head指向newnode,这样就把元素入栈了。还有一种特殊情况是本来就是空的栈,则新生成的newnode就是head。出栈函数实现,需要定义一个next指针指向head下一个,确保把栈顶元素删除后,还能找到后面的元素。Free掉记得把指针置为NULL。其他函数没什么难点,注意以上几个点即可实现以下函数。

#include"Stack.h"
//初始化
void StackInit(Stack* ps)
{assert(ps);ps->head = NULL;}
//销毁
void StackDestory(Stack* ps)
{assert(ps);ST* cur = ps->head;while (cur){ST* next = cur->next;free(cur);cur = next;}ps->head = NULL;}
//入栈
void StackPush(Stack* ps, StDatetype x)
{assert(ps);ST* newnode = (ST*)malloc(sizeof(ST));if (newnode ==NULL){printf("malloc fail\n");exit(-1);}newnode->data = x;newnode->next = NULL;if (ps->head == NULL){ps->head = newnode;}else{newnode->next = ps->head;ps->head = newnode;}}
//出栈
void StackPop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));if (ps->head->next == NULL){free(ps->head);ps->head = NULL;}else{ST* next = ps->head->next;free(ps->head);ps->head = next;}
}
//栈上的数据个数int  StackSize(Stack * ps){assert(ps);int size = 0;ST* cur = ps->head;while (cur){size++;cur = cur->next;}return size;}//栈顶元素StDatetype StackTop(Stack* ps){assert(ps);assert(!StackEmpty(ps));return ps->head->data;}bool StackEmpty(Stack* ps)
{assert(ps);return ps->head == NULL;
}

3.测试函数功能代码🙌

#include"Stack.h"void Test1()
{Stack s;StackInit(&s);StackPush(&s, 1);StackPush(&s, 2);StackPush(&s, 3);StackPush(&s, 4);printf("栈上的元素个数:%d\n", StackSize(&s));printf("栈顶元素:%d\n", StackTop(&s));if (StackEmpty(&s)){printf("栈空\n");}else{printf("栈不为空\n");}printf("入栈输入顺序为1234,出栈顺序输出:\n");while (!StackEmpty(&s)){printf("%d", StackTop(&s));StackPop(&s);}printf("\n");if (StackEmpty(&s)){printf("栈空\n");}else{printf("栈不为空\n");}StackDestory(&s);printf("\n");
}int main()
{Test1();return 0;
}

功能测试结果展示图:
在这里插入图片描述

总结撒花💞

   本篇文章旨在分享详解C语言实现链栈。希望大家通过阅读此文有所收获本次关于栈的实现相对于之前链表的实现简单一点,指针的指向没有那么复杂,主要是对入栈和出栈的功能实现。但也有很多地方需要注意的。比如说,野指针的问题,动态开辟的空间一定要free掉,并且把指针置为NULL。用动态实现,相对于静态实现还比较灵活,也能对空间有很大的节省。
   😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

相关内容

热门资讯

安卓系统相册软件下载,下载与使... 手机里的相册是不是已经满满当当,想要给它们找个新家?别急,今天就来给你安利几款超好用的安卓系统相册软...
安卓9系统优化软件,解锁流畅体... 你有没有发现,自从你的安卓手机升级到了安卓9系统,运行速度好像变得更快了?是不是觉得手机变得更加流畅...
各厂商安卓系统对比,性能、特色... 你有没有发现,现在手机市场上安卓系统的竞争可是相当激烈呢!各大厂商纷纷推出自己的特色系统,让人眼花缭...
车机进入安卓系统,智能驾驶体验... 你有没有发现,最近你的车机系统好像变得不一样了?没错,车机系统正在悄悄地进入安卓的大家庭!这可不是什...
安卓系统自带壁纸高清,自带高清... 亲爱的手机控们,你是否曾为安卓系统自带的那些高清壁纸而驻足欣赏?那些色彩斑斓、风格迥异的画面,是不是...
安卓机换成钟表系统,探索智能穿... 你有没有想过,你的安卓手机其实也可以换上钟表系统呢?是的,你没听错,就是那种优雅、简洁、充满艺术感的...
安卓lcs操作系统,轻量级、安... 你知道吗?在智能手机的世界里,有一个操作系统可是相当出名的,那就是安卓LCS操作系统。它就像一位魔法...
安卓系统微信包月,畅享无限制沟... 你知道吗?在咱们这个手机不离手的年代,微信可是咱们日常生活中不可或缺的好帮手。不过,你知道吗?安卓系...
我想换安卓系统,系统升级换新体... 亲爱的读者,你是否也有过这样的冲动?看着身边的朋友纷纷换上了安卓系统,心里痒痒的,也想尝试一下?没错...
用了苹果换安卓系统,系统更迭背... 你知道吗?最近我可是经历了一场大变身呢!是的,你没听错,我用苹果手机换成了安卓系统。这可不是一个小决...
手机刷机系统安卓,解锁手机潜能... 你有没有想过,你的手机是不是已经有点儿“老态龙钟”了呢?别急,别急,今天就来给你揭秘如何给手机来个焕...
安卓pe10系统,功能与特色深... 你有没有听说最近安卓PE10系统火得一塌糊涂?没错,就是那个让无数手机用户为之疯狂的系统。今天,我就...
安卓系统程序安装目录,安卓系统... 你有没有想过,当你手机里安装了一个又一个应用程序时,它们都藏在哪里呢?没错,就是那个神秘的安卓系统程...
ios系统能定位安卓系统吗,i... 你有没有想过,你的iPhone和安卓手机之间竟然能玩出这么一出“追踪大戏”?没错,我要说的就是那个让...
安卓系统时间放到桌面,桌面概览... 你有没有发现,手机上的时间有时候会偷偷跑得飞快,让你不知不觉就错过了重要的事情?别急,今天就来教你怎...
安卓系统怎么刷win,体验全新... 你有没有想过,把你的安卓手机变成一台Windows电脑呢?听起来是不是有点不可思议?但别急,今天我就...
安卓仿苹果系统设置,打造极致用... 你有没有发现,现在越来越多的安卓手机开始模仿苹果的操作系统了?没错,就是那个简洁又好用的设置界面!今...
emui 安卓系统对应关系,E... 你有没有发现,每次打开你的华为手机,那个界面看起来是不是特别顺眼?那是因为华为的EMUI系统,它就像...
永诺安卓系统相机,功能解析与使... 你有没有发现,手机拍照已经成为我们生活中不可或缺的一部分?而在这其中,永诺安卓系统的相机功能可是相当...
tinder安卓版系统错误,揭... 最近在使用Tinder安卓版的时候,你是不是也遇到了一些让人头疼的系统错误呢?别急,今天就来和你聊聊...