当前位置: 首页 > news >正文

追梦之旅【数据结构篇】——详解C语言实现动态版顺序栈

详解C语言动态实现顺序栈~😎

  • 前言🙌
  • 预备小知识💞
    • 栈的概念及结构
  • 整体实现内容分析💞
    • 1.头文件编码实现🙌
    • 2.功能文件编码实现🙌
    • 3.测试文件的编写:🙌
  • 总结撒花💞

追梦之旅,你我同行

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

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

前言🙌

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

预备小知识💞

栈的概念及结构

在这里插入图片描述

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端
称为栈顶,另一端称为栈底
。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。

整体实现内容分析💞

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小顺序栈的设计思想是用数组,相比于静态数组,动态数组来设计的话会更加灵活一点。然后还是和链表那样实现栈的基本功能,这里就不赘述了。

1.头文件编码实现🙌

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

其实大致的实现和链栈差不多,这里先定义一个栈的结构体,用typedef给结构体和数据类型取别名,然后就是各种功能函数的声明,和上述链表差不多

#include<stdio.h>
#include<assert.h>
#include<stdbool.h>#include<stdlib.h>typedef int StDatetype;
typedef struct StackNode
{StDatetype* a;StDatetype top;StDatetype capacity;
}ST;
//初始化
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);void StackPrint(ST* ps);

2.功能文件编码实现🙌

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

这里是功能函数的实现,需要注意的地方和编写的算法和链栈实现差不多。只是用数组实现的话,在扩容上不够灵活,会产生空间浪费的问题为了减少空间浪费,这里采用动态数组,扩容时采用增加2倍,比较合理的申请空间。然后就是要通过画图,来帮助自己理清指针的指向,需要注意的是free掉指针后一定要将指针置为NULL,不然会造成野指针的问题。

#include"Stack.h"//初始化
void StackInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = 0;ps->top = 0;}
//销毁
void StackDestory(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = ps->top = 0;}
//入栈
void StackPush(ST* ps, StDatetype x)
{assert(ps);if (ps->top == ps->capacity){StDatetype newnode = ps->capacity == 0 ? 4 : ps->capacity * 2;StDatetype* temp = (StDatetype*)realloc(ps->a, sizeof(StDatetype)*newnode);if (temp == NULL){printf("realloc fail\n");exit(-1);}ps->a = temp;ps->capacity = newnode;}ps->a[ps->top] = x;ps->top++;}
//出栈
void StackPop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));ps->top--;}
//栈上的数据个数
int  StackSize(ST* ps)
{  assert(ps);return ps->top;
}
//栈顶元素
StDatetype StackTop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));return ps->a[ps->top - 1];
}bool StackEmpty(ST* ps)
{return ps->top == 0;
}
void StackPrint(ST* ps)
{while (!StackEmpty(&ps)){printf("%d", StackTop(&ps));StackPop(&ps);}printf("\n");
}

3.测试文件的编写:🙌

#include"Stack.h"void StackTest()
{ST st;StackInit(&st);StackPush(&st, 1);StackPush(&st, 2);StackPush(&st, 3);StackPush(&st, 4);printf("栈的输出\n");while (!StackEmpty(&st)){printf("%d", StackTop(&st));StackPop(&st);}StackDestory(&st);
}int main()
{StackTest();return 0;
}

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

总结撒花💞

   本篇文章旨在分享详解C语言实现动态版顺序栈。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

http://www.lryc.cn/news/16561.html

相关文章:

  • Ubuntu 使用Nohup 部署/启动/关闭程序
  • Spring 用到了哪些设计模式
  • Linux上基于PID找到对应的进程名以及所在目录
  • jvm知识点与面试题
  • 算法前缀和—Java版
  • 拨开迷雾 看见vivo穿越周期的秘密
  • 浅谈常用的日志框架
  • 字节是真的难进,测开4面终上岸,压抑5个月,终于可以放声呐喊
  • Bash初识
  • ElasticSearch Script 操作数据最详细介绍
  • 【黑盒模糊测试】路由器固件漏洞挖掘实战--AFL++ qemu_mode
  • 【java实现Word模板导出】Xdocreport和Freemaker
  • Stable-Baselines 3 部分源代码解读 3 ppo.py
  • [业务逻辑] 订单超时怎么处理
  • iOS上架及证书最新创建流程
  • python入门
  • Linux部署java项目
  • elisp 从简单实例开始.
  • ThreeJS加载geojson数据实现3D地图
  • 深度学习无监督磁共振重建方法调研(二)
  • 蓝桥杯入门即劝退(十九)两两交换链表
  • 【Java 面试合集】接口以及抽象类
  • LeetCode 2391. 收集垃圾的最少总时间
  • 【PMP考试最新解读】第七版《PMBOK》应该如何备考?(含最新资料)
  • 金三银四软件测试面试如何拿捏面试官?【接口测试篇】
  • Hive基操
  • CSS(配合html的网页编程)
  • MATLAB/Simulink 通信原理及仿真学习(三)
  • 如何解决过拟合与欠拟合,及理解k折交叉验证
  • Kotlin 34. recyclerView 案例:显示列表