文章目录

  • 前言
  • 顺序队列结构图示
  • 顺序队列的实现以及入队出队(C语言实现)
  • 链式队列结构图示
  • 链式队列的实现以及基本算法(C++实现)
  • 循环队列(C++实现)

前言

其实这章再写下去就是无聊的重复了,本质上来讲,栈和队列都是特殊的线性表,而线性表的两种实现方式,顺序和链式,运用到栈和队列上,也就变成了顺序栈和链式栈,顺序队列和链式队列。所以写法都是一样的,唯一不一样的就是规则不一样,栈先进后出,队列先进先出而已。
所以这节的代码和栈很相似,写代码本来就很枯燥,写重复的代码更枯燥
所以呢,这章我会有一部分使用C++实现
前边说过,课本上面给出的代码片是C++和伪代码的形式,之前我一直用的C语言来实现算法,所以书上使用的引用我只能用双重指针来替换,很多人可能指针用的不是很熟,不太懂,所以这章我会给出几个C++写法(讲真,C++确实好用多了,指针真的烦 #%#-~)

顺序队列结构图示

注意:此处我给出的结构,队头指针所指地方没有存数据,在有的地方你也会看到,队头存了数据,队尾指针不存数据。
这里存不存数据,其实不用纠结,此处和栈的写法是类似的,我们存不存都行。我们统一操作之后,若入队的时候先入队,指针再加加,那队头就有数据,但是队尾没有,若我们统一操作为,指针先加加,再入队,那队头就没存数据了。哪个方便就用哪个,无所谓。

顺序队列的实现以及入队出队(C语言实现)

#include<stdio.h>
#include<malloc.h>
typedef struct QNode{int x;
}QDataNode;typedef struct{QDataNode *front;QDataNode *rear;
}QHeadNode,*LinkQueue;#define MaxSize 100int InitQueue(LinkQueue *Q){(*Q)=(LinkQueue)malloc(sizeof(QHeadNode));(*Q)->front=(*Q)->rear=(QDataNode *)malloc(sizeof(QDataNode)*MaxSize);if(!(*Q)->front) return -1;return 0;
}
int EnQueue(LinkQueue *Q,int e){//因为第一个位置空着没存数据 所以这里判断队满用的是MaxSize-1if((*Q)->rear-(*Q)->front == MaxSize-1){return -1;//队满}(*Q)->rear++;(*Q)->rear->x=e;return 0;
}
int DeQueue(LinkQueue *Q,int *e){if((*Q)->front==(*Q)->rear) return -1;(*Q)->front++;*e=(*Q)->front->x;return 0;
}int main(){LinkQueue Q;InitQueue(&Q);for(int i=1;i<=10;i++){EnQueue(&Q,i);}int e;while(Q->front != Q->rear){DeQueue(&Q,&e);printf("%d ",e);}
}

链式队列结构图示

链式队列的实现以及基本算法(C++实现)

注:书上给出的很多算法是代码片,但是我在博客中给出的程序都是完整的,可以运行的,并不是代码片。

/******
author:  1900
language: C++
******/
#include<malloc.h>
#include<iostream>
using namespace std;
typedef struct QNode{int data;struct QNode *next;
}QNode,*QueuePtr;
typedef struct{QueuePtr front;//队头指针QueuePtr rear;//队尾指针
}LinkQueue;int InitQueue(LinkQueue &Q){//初始化Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));if(!Q.front) return -1;//申请失败Q.front->next=NULL;return 0;
}
int EnQueue(LinkQueue &Q,int e){//入队QueuePtr p=(QueuePtr)malloc(sizeof(QNode));if(!p) return -1;p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;return 0;
}
int DeQueue(LinkQueue &Q,int &e){//出队if(Q.front==Q.rear) return -1;//队列为空QueuePtr p=Q.front->next;e=p->data;Q.front->next=p->next;if(Q.rear==p) Q.rear=Q.front;//队空return 0;
}int main(){LinkQueue Q;InitQueue(Q);for(int i=1;i<=10;i++){EnQueue(Q,i);}int e;while(Q.front!=Q.rear){DeQueue(Q,e);cout<<e<<endl;}
}

循环队列(C++实现)

循环队列的优势在于节省空间,已经出队的元素把空间腾出来了,不用就浪费了,所以有了循环队列。
所以,循环队列是针对顺序队列的改进,因为链式队列不存在浪费空间的缺点,所以这是对顺序队列的优化。
这里我用**C++**实现的,主要是用C语言的话,此处将使用大量的指针,指来指去,容易晕

//C++
/**
这个顺序循环队列的初始空间大小是10个位置
下面进行的操作是:
先把1-8这8个数字入队
再进行五次出队操作
再把10 20 30 40 50 这五个数字入队
把队中元素全部出队
**/#include<iostream>
#include<malloc.h>
using namespace std;typedef struct{int *base;int front;int rear;
}SqQueue;#define MaxSize 10int InitQueue(SqQueue &Q){Q.base=(int *)malloc(sizeof(int)*MaxSize);if(!Q.base) return -1;Q.front=Q.rear=0;return 0;
}
int EnQueue(SqQueue &Q,int e){if((Q.rear+1)%MaxSize==Q.front) return -1;//队满Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MaxSize;return 0;
}
int DeQueue(SqQueue &Q,int &e){if(Q.front==Q.rear) return -1;e=Q.base[Q.front];Q.front=(Q.front+1)%MaxSize;return 0;
}int main(){SqQueue Q;InitQueue(Q);for(int i=1;i<=8;i++){EnQueue(Q,i);}int e;for(int i=1;i<=5;i++){DeQueue(Q,e);cout<<e<<endl;}for(int i=1;i<=5;i++){EnQueue(Q,i*10);}while(Q.front != Q.rear){DeQueue(Q,e);cout<<e<<endl;}
}

章节3.4----队列的实现与应用相关推荐

  1. 数据结构与算法_03队列

    数据结构与算法_03队列 队列 0.章节重点整理 1.认识队列 1.1. 队列的工作运算 1.2.队列的数组实现 1.3.队列的链表实现 2.队列的应用 2.1.环形队列 2.2.双向队列 队列 0. ...

  2. 第17章 高级数据表示 17.5用队列进行模拟

    2019独角兽企业重金招聘Python工程师标准>>> 前一章节讲的队列现在可以使用了.很多现实生活中的情形都包含队列.例如,在银行或超级市场的顾客队列,在机场的飞机队列,多任务计算 ...

  3. 系统程序员成长计划-组合的威力

    在<设计模式-可复用面向对象软件的基础>的序言里提到软件设计的两个基本原则: 针对接口编程,而不是针对实现编程.接口是抽象的,因为抽象所以简单.接口是对象的本质,因为是本质所以稳定.接口是 ...

  4. 实操指南 | Resource Queue如何实现对AnalyticDB PostgreSQL的资源管理?

    简介:作者:阿里云数据库OLAP产品部 - 子华 一 背景 AnalyticDB PostgreSQL版(简称ADB PG)是阿里云数据库团队基于PostgreSQL内核(简称PG)打造的一款云原生数 ...

  5. STL工具书(常用用法总结)

    STL工具书(常用用法总结) 此博客可用于常用STL用法的快速查询与使用, 对于原理方面可以查阅相关文档. 目录 STL工具书(常用用法总结) 1. 容器 1.1 序列式容器 1. 数组(array) ...

  6. 史上STL最最最最最最全工具书,看我就够了

    写在前面:这里是小王成长日志,一名在校大学生,想在学习之余将自己的学习笔记分享出来,记录自己的成长轨迹,帮助可能需要的人.欢迎关注与留言. 注意:这篇博客默认: 第一,你已经明了基本的数据结构的知识, ...

  7. Python 爬虫 携程池 爬取腾讯动漫

    简介 主要爬取腾讯动漫上某一漫画的所有图片的url 所用到的库 分析腾讯动漫网址 代码 所用到的库 gevent gevent.pool requests selenium xpath 分析腾讯动漫 ...

  8. 计算机音乐怎么调音速,音速调节器(音乐速度调节器) PRO v10.3.4 for Android 特别清爽版...

    摘要 一个可以更改音频文件的速度但是不影响音调,或者是更改音调却不影响速度,也可以两个一起调整,将歌曲的音调升高或者是降低,还有均衡器,8段图形的均衡器,很适合去制作那种Nightcore风格音乐,感 ...

  9. FreeRTOS官方指导文档阅读笔记

    FreeRTOS官方指导文档阅读笔记 基于 161204_Mastering_the_FreeRTOS_Real_Time_Kernel-A_Hands-On_Tutorial_Guide.pdf,可 ...

  10. 算法章节 数组、链表、栈、队列

    数组 概念与特性 1,数组是线性表,用一组连续的内存空间存储⼀组具有相同类型的数据 2,最大的特性是⽀持按照下标O(1)时间复杂度内快速访问数组元素 3,⼀维数组寻址公式:a[i]_addr = ba ...

最新文章

  1. (原創) 如何將編譯結果,統一放在一個目錄下? (SOC) (Quartus II)
  2. 宝塔Linux/Windows面板如何添加网站?附图文教程
  3. oracle 孟硕_关于几大主机厂的阿里云论坛用户知识和技术交流
  4. 程序的加载和执行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25
  5. DCMTK:转换dicom文件编码
  6. MySql(18)——Linux MySQL主从配置
  7. 高德地图轨迹回放_高德地图上线了一个新功能….
  8. XML模板解析————Dom4j解析xml案例分析
  9. wap打包 本地化 hbuilder_秋收接近尾声 冰城开启秸秆打包、秋整地
  10. 在Emacs24下的Java环境(Cedet+Elib+JDEE+ECB)
  11. Ubuntu 解压缩
  12. win10无线投屏_win10投屏快捷键无需频繁插拔
  13. 【HW2020漏洞回顾】深信服EDR两大漏洞(转载)
  14. 无盘服务器0x00000124,知识分享电脑故障0x00000124导致蓝屏的原因和解决思路-电脑蓝屏原因...
  15. Neural Networks and Deep Learning - 神经网络与深度学习 - Overfitting and regularization - 过拟合和正则化
  16. 微信开放平台第三方平台授权小程序权限集id对应中文说明
  17. eclipse Build Automatically在哪里
  18. 什么是FEC/NACK/RTX
  19. Pycharm启动后总 indices... indexing的问题
  20. 一文搞懂什么是模拟退火算法SImulated Annealing【附应用举例】

热门文章

  1. css实现在一行显示多余部分显示省略号
  2. ireport 用html页面上 图片怎么都出不来 全是红叉的处理办法
  3. 让Android的输入框与文本框带滚动条ScrollView
  4. AJAX, JSON.js,Newtonsoft.Json.dll,nunit.framework.dll 源代码
  5. URLDecoder和URLEncoder的使用总结
  6. Visual Studio 2017 15.9 Previews扩展C++调试功能
  7. 大数据技术将是传统企业创新的原点
  8. [Algo] Print Matrix Diagonal 对角打印
  9. cocos2d-iphone 3.X 进度条的实现
  10. 一个ExtJs的最基本的mvc模式示例