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

数据结构——顺序栈及函数实现(C语言)

一、什么是顺序栈

1.栈

(1)栈是限定仅在表尾进行插入或删除操作的线性表。也就是说,栈只能在一段进行插入和删除操作。

(2)特点:先进后出

(3)对栈来说,插入和删除的一端(表尾端)称为栈顶;相应地,另一端(表头端)成为栈底。不含元素的空表称为空栈。

(4)栈的插入操作,一般称为入栈/压栈/进栈;栈的删除操作,一般称为出栈/弹栈。

2.顺序栈

顺序栈,即栈的顺序存储结构。是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设栈顶指针top指示栈顶元素在顺序栈中的位置。

其思路与顺序表类似:

数据结构——线性表的顺序存储结构及函数实现(C语言)https://blog.csdn.net/wy_05136/article/details/159045575?spm=1001.2014.3001.5501

二、顺序栈结构体设计及函数实现(C语言)

(一)顺序栈的结构体设计

1.一组地址连续的存储单元(通常用数组):依次存放自栈底到栈顶的数据元素

2.栈顶指针top:指示栈顶元素的下一个存储位置(也能表示当前有效元素的个数)

3.栈当前可使用的最大容量stacksize

#include <cassert> #include <corecrt_malloc.h> #include <cstdlib> #include <stdio.h> #define STACK_INIT_SIZE 10 //顺序表实现的栈 的初始大小 typedef int ElemType; //顺序栈的结构体设计 typedef struct SeqStack { //1.指针类型,用来接收malloc的返回值 ElemType* base; //2.栈顶指针,用来指向栈顶元素的下一个存储位置(其实也能表示当前有效元素的个数) int top; //栈顶指针并不一定要用指针类型,能起到相同作用即可 //3.当前总的空间大小(用来扩容的) int stacksize; }SeqStack;

(二)顺序栈的C语言函数实现

1.初始化

void Init_SeqStack(SeqStack* psq) { //0.断言:检查传入的指针是否为空 assert(psq != NULL); //1.动态分配栈的底层数组内存 psq->base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if (psq->base == NULL) exit(EXIT_FAILURE); //内存分配失败 //2.栈顶指针为0,表示栈为空 psq->top = 0; //3.初始空间大小 psq->stacksize = STACK_INIT_SIZE; }

2.判满

bool Full(SeqStack* psq) { //bool Full(const SeqStack* psq); 更合适 //0.断言:检查传入的指针是否为空 assert(psq != NULL); //1.若栈顶指针(有效元素个数) == 空间大小,说明栈已满,返回true; // 否则,返回false return psq->top == psq->stacksize; }

因为此函数无需对栈进行修改,故而参数前加const更合适;此处为了与其它函数统一,所以未加。

3.判空

bool Empty(SeqStack* psq) { //bool Empty(const SeqStack* psq); 更合适 //0.断言:检查传入的指针是否为空 assert(psq != NULL); //1.若栈顶指针(有效元素个数) == 0,说明栈为空,返回true; // 否则,返回false return psq->top == 0; }

因为此函数无需对栈进行修改,故而参数前加const更合适;此处为了与其它函数统一,所以未加。

4.扩容

void Increase(SeqStack* psq) { //0.断言:检查传入的指针是否为空 assert(psq != NULL); //1.将空间大小扩大为原来的2倍 ElemType* tmp = (ElemType*)realloc(psq->base, psq->stacksize * sizeof(ElemType) * 2); //2.若扩容成功,则更新指针和空间大小 if (tmp != NULL) { psq->base = tmp; psq->stacksize *= 2; } }

5.入栈

bool Push(SeqStack* psq, ElemType val) { //0.断言:检查传入的指针是否为空 assert(psq != NULL); //1.判满(如果满了就扩容) if (Full(psq)) Increase(psq); //2.直接给top下标的格子插入val值 psq->base[psq->top] = val; //3.更新栈顶指针 psq->top++; return true; }

6.出栈

bool Pop(SeqStack* psq) { //0.断言:检查传入的指针是否为空 assert(psq != NULL); //1.判空 assert(!Empty(psq)); //2.直接将top指针往前走一下 psq->top--; return true; }

7.获取栈顶元素值

ElemType Top(SeqStack* psq) { //ElemType Top(const SeqStack* psq); 更合适 //0.断言:检查传入的指针是否为空 assert(psq != NULL); //1.判断栈是否为空,若为空,则不存在栈顶元素 assert(!Empty(psq)); //2.直接返回栈顶元素的值 return psq->base[psq->top - 1]; }

因为此函数无需对栈进行修改,故而参数前加const更合适;此处为了与其它函数统一,所以未加。

8.清空

void Clear(SeqStack* psq) { //0.断言:检查传入的指针是否为空 assert(psq != NULL); //1.直接将栈顶指针设为0 psq->top = 0; }

9.销毁

void Destroy(SeqStack* psq) { //0.断言:检查传入的指针是否为空 assert(psq != NULL); //1.释放内存 free(psq->base); psq->base = NULL; //避免野指针 //2.重置状态 psq->top = 0; psq->stacksize = 0; }

10.打印

void Show(SeqStack* psq) { //void Show(const SeqStack* psq); 更合适 //0.断言:检查传入的指针是否为空 assert(psq != NULL); //1.从栈底开始依次打印 for (int i = 0; i < psq->top; i++) printf("%d ", psq->base[i]); printf("\n"); }

因为此函数无需对栈进行修改,故而参数前加const更合适;此处为了与其它函数统一,所以未加。

11.主函数测试

int main() { SeqStack stack; //初始化 Init_SeqStack(&stack); //入栈+判满 printf("入栈(栈不满的情况下):\n"); Push(&stack, 1); Push(&stack, 2); Push(&stack, 3); Show(&stack); if (Full(&stack)) printf("栈已满\n\n"); else printf("栈未满\n\n"); Push(&stack, 4); Push(&stack, 5); Push(&stack, 6); Push(&stack, 7); Push(&stack, 8); Push(&stack, 9); Push(&stack, 10); Show(&stack); if (Full(&stack)) printf("栈已满\n\n"); else printf("栈未满\n\n"); printf("入栈(栈满的情况下):\n"); Push(&stack, 11); //函数中包含扩容函数 Show(&stack); printf("\n"); //出栈 printf("出栈:\n"); Pop(&stack); Show(&stack); printf("\n"); //获取栈顶元素值 printf("栈顶元素值为 %d\n", Top(&stack)); printf("\n"); //清空+判空 Show(&stack); if (Empty(&stack)) printf("栈已空\n\n"); else printf("栈未空\n\n"); Clear(&stack); if (Empty(&stack)) printf("栈已空\n\n"); else printf("栈未空\n\n"); //销毁 Destroy(&stack); return 0; }

http://www.jsqmd.com/news/611777/

相关文章:

  • 厦门大学845数据结构考研考试范围(大纲)和参考书目
  • 低成本GPU算力方案:Z-Image-Turbo在RTX 3060上稳定运行的显存优化部署教程
  • Pixel Couplet Gen效果展示:神荼郁垒像素方块+气球爆炸交互真实案例
  • AI Agent Harness Engineering 在政府数字化中的机会与限制
  • 中科院FlowPIE:AI实现科学创意自动孵化突破研究范式创新
  • 寻音捉影·侠客行真实案例分享:某MCN机构用其日均处理200+小时口播素材
  • 2026年度滴鸡精红榜:谁才是真正的纯滴萃“天花板”?
  • RK3568Ubuntu20.04安装qtopencv
  • 如何在Windows 11上流畅运行Android应用?跨平台应用融合完全指南
  • 像素时装锻造坊:零基础5分钟上手,用AI生成你的专属像素时装
  • PowerPaint-V1应用技巧:用Seed值固定最佳效果,批量修图必备
  • 个人知识库构建:OpenClaw+Qwen3-32B自动整理Markdown笔记
  • 【基于Python技术的智慧中医商业项目】后端应用Articles代码实现(四)
  • 乙巳马年春联生成终端作品分享:企业年会定制化春联生成实录
  • BGE-M3向量化流水线:PDF解析→分块→BGE-M3嵌入→FAISS入库全链路
  • Qwen3.5-9B-AWQ-4bit快速上手:上传图片+中文提问,10分钟搭建AI看图助手
  • PasteMD性能测试报告:不同硬件配置下的转换效率对比
  • DeepSeek-R1-Distill-Qwen-1.5B性能实测:A10G显卡上吞吐达14.2 tokens/s,能效比提升300%
  • 终极指南:如何快速重置JetBrains IDE试用期并延长30天免费使用
  • 终极指南:如何将Sublime Text 3转变为强大的Python开发IDE
  • 华中农业大学考研真题之867-数据结构与算法
  • 北京一明影视联系方式查询指南:如何有效联系专业影视制作团队并评估其服务 - 品牌推荐
  • gte-base-zh开源模型部署Checklist:20项生产环境必备验证项清单
  • ide-eval-resetter 试用期重置技术指南:JetBrains IDE全功能持续使用全攻略
  • TranslateGemma-12B性能基准测试:不同硬件平台对比
  • Retinaface+CurricularFace在Ubuntu系统上的最佳实践
  • Pixel Script Temple 从需求到部署:全栈应用一键脚本生成工作流展示
  • 在 macOS 上修改 最大文件描述符限制(Too many open files) 和 网络端口相关参数 需要调整系统级配置的详细步骤
  • 终极鸣潮自动化指南:如何用OK-WW轻松实现后台自动战斗与声骸刷取
  • 2026中效过滤器厂家哪家好?行业实力品牌推荐 - 品牌排行榜