恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

数据结构--栈和队列

  • 首页
  • 资讯中心
  • /
  • 数据结构--栈和队列

相关资讯

本地部署AI图生视频工具:从静态图片生成动态短视频的完整实践指南 2026/8/24 16:17:54
ESP32局域网实时音频流硬件链路搭建与四大经典坑位解析 2026/8/24 16:12:54
抖音批量下载 3 步跑完全指南:主页、合集一次归档,自动去重不断点 2026/8/24 16:12:54

最新资讯

BepInEx 6.0 终极指南:5步快速搭建Unity游戏插件框架并跑通第一个模组
WandEnhancer 免费教程:三步本地解锁 WeMod Pro 功能
去中心化多智能体系统:基于共享上下文的协同AI架构设计与实战
Pro Git 中文版本地安装指南:10 分钟在电脑上构建并读完这本开源书
数学建模竞赛HIMCM全攻略:从赛题解析到论文写作的实战指南
VASO框架:构建可验证自进化物理AI智能体的安全基石

今日推荐

OpenModScan:免费跨平台 Modbus 主站调试工具,让现场通讯验证一键搞定
WechatHook 终极指南:5大核心能力详解,3分钟看懂微信自动化
如何在ThinkPad X390上安装macOS:OpenCore EFI完整指南

本周热门

Nextcloud 桌面客户端:把同步交给它,你只管改文件
如何将 HTML 转成 Word 文档且格式不丢失?html-to-docx 使用教程
Anki 批量操作卡片完整指南:一次搞定上千张,不再逐张修改

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

数据结构--栈和队列

发布时间:2026/8/24 16:17:54
数据结构--栈和队列 1 栈1.1 栈的结构和概念栈:一种特殊的线性表其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端、称为栈顶另一端称为栈底。栈中的数据元素遵守后进先出LIFOLast In First Out的原则。压栈栈的插入操作叫做进栈/压栈/入栈入数据在栈顶。出栈栈的删除操作叫做出栈。出数据也在栈顶1.2 栈的实现//Stack.h #include stdio.h #include stdlib.h #include assert.h #include stdbool.h typedef char STACKData; typedef struct Stack { STACKData* a; int top; int capacity; }ST; // 栈的初始化 void StackInit(ST* ps); //栈的销毁 void StackDestroy(ST* ps); //栈的插入 void StackPush(ST* ps, STACKData x ); //栈的弹出 void StackPop(ST* ps); //获取栈顶元素 STACKData StackTop(ST* ps); //获取栈中有效元素个数 int StackSize(ST* ps); //检测栈是否为空 bool StackEmpty(ST* ps ); //Stack.c #include Stack.h // 栈的初始化 void StackInit(ST* ps) { assert(ps); ps-a NULL; ps-capacity 0; ps-top 0; } //栈的销毁 void StackDestroy(ST* ps) { assert(ps); free(ps-a); ps-a NULL; ps-capacity ps-top 0; } //栈的插入 void StackPush(ST* ps, STACKData x) { if (ps-top ps-capacity) { int newcapacity ps-capacity 0 ? 4 : ps-capacity * 2; ps-a(STACKData*)realloc(ps-a,sizeof(STACKData) * newcapacity); ps-capacity newcapacity; } ps-a[ps-top] x; ps-top; } //栈的弹出 void StackPop(ST* ps) { assert(ps); assert(ps-top); ps-top--; } //获取栈顶元素 STACKData StackTop(ST* ps) { assert(ps); assert(ps-top0); return ps-a[ps-top-1]; } //获取栈中有效元素个数 int StackSize(ST* ps) { assert(ps); return ps-top; } //检测栈是否为空 bool StackEmpty(ST* ps) { assert(ps); return ps-top 0; }注:栈的实现一般可以使用数组或者链表实现相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小2 队列2.1队列的结构和概念队列只允许在一端进行插入数据操作在另一端进行删除数据操作的特殊线性表队列具有先进先出FIFO(First In First Out) 入队列进行插入操作的一端称为队尾 出队列进行删除操作的一端称为队头2.2队列的实现//Queue.h #include stdio.h #include stdlib.h #include assert.h #include stdbool.h typedef int QueneData; typedef struct QueneNode { QueneData x; struct QueneNode* next; }QuNode; typedef struct Quene { QuNode* phead; QuNode* ptail; int size; }Qu; //队列初始化 void QueneInit(Qu* pq); //队尾入队列 void QuenePush(Qu* pq, QueneData x ); //队头出队列 void QuenePop(Qu* pq); //获取队列尾部元素 QueneData QueneTail(Qu* pq); //获取队列头部元素 QueneData QueneFront(Qu* pq); //获取队列里的有效个数 int QueneSize(Qu* pq); //检测队列是否为空 bool QueneEmpty (Qu* pq); //销毁队列 void QueneDestroy(Qu* pq); //Queue.c #include Quene.h //队列初始化 void QueneInit(Qu* pq) { assert(pq); pq-phead NULL; pq-ptail NULL; pq-size 0; } //队尾入队列 void QuenePush(Qu* pq, QueneData x) { QuNode* newnode (QuNode*)malloc(sizeof(QuNode)); newnode-x x; newnode-next NULL; if (pq-phead NULL) { pq-phead pq-ptail newnode; } else { pq-ptail-next newnode; pq-ptail newnode; } pq-size; } //队头出队列 void QuenePop(Qu* pq) { assert(pq); assert(pq-phead); if (pq-phead-next NULL) { free(pq-phead); pq-phead pq-ptail NULL; } else { QuNode* next pq-phead-next; free(pq-phead); pq-phead next; } pq-size--; } //获取队列尾部元素 QueneData QueneTail(Qu* pq) { assert(pq); return pq-ptail-x; } //获取队列头部元素 QueneData QueneFront(Qu* pq) { assert(pq); return pq-phead-x; } //获取队列里的有效个数 int QueneSize(Qu* pq) { assert(pq); return pq-size; } //检测队列是否为空 bool QueneEmpty(Qu* pq) { assert(pq); return pq-size 0; } //销毁队列 void QueneDestroy(Qu* pq) { assert(pq); QuNode* cur pq-phead; while (cur) { QuNode* next cur-next; free(cur); cur next; } pq-phead pq-ptail NULL; pq-size 0; }注:队列也可以数组和链表的结构实现使用链表的结构实现更优一些因为如果使用数组的结构出队列在数组头上出数据效率会比较低。2.3 环形队列(了解)另外扩展了解一下实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列可以使用数组实现也可以使用循环链表实现buf[0] buf[1] buf[2] buf[3] buf[4] ↑tail ↑head 可读tail ~ head‑1 head下一次写 head1tail下一次读 tail取模% N实现环形当下标走到数组末尾回到 0。我这里直接使用定长数组来写了要是想更完美一点可以换成顺序表或者链表#pragma once #include iostream #define SIZE 1024 templateclass T struct ring_buffer { T _buffer[SIZE]; int _pw; int _pr; ring_buffer() :_pw(0) ,_pr(0) { } void RbWrite(const T val) { int i (_pw 1) % SIZE; if (i ! _pr) { _buffer[_pw] val; _pw (_pw 1) % SIZE; } else { return; } } T RbRead() { if (_pw !_pr) { T ret _buffer[_pr]; _pr (_pr 1) % SIZE; return ret; } else { return T(); } } };

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号