队列的顺序表示和实现

一、循环队列概述

循环队列 是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。
队头指针(front) 指向队列的队头元素。
队尾指针(rear) 指向队列的最后一个元素的下一个元素。
pBase 指向块内存的首地址

二、循环队列存储结构

在顺序实现是 队尾指针和队头指针指的就是下标

typedef struct CircularQueue//队列参数
{int * pBase;//指向数组首地址的指针int front;//出队下标指向队列的要出队的第一个元素int rear;//入队下标,指向队列元入队元素的下一个空间
}CircularQueue, *pCircularQueue;

三、循环队列的操作定义

//1、初始化循环队列
void InitCircularQueue(pCircularQueue Q);
// 2、返回队列中已有元素个数
int CircularQueueLength(pCircularQueue Q);
// 3、判断循环队列是否为满
bool CircularQueueIsFull(pCircularQueue Q);
// 4、将元素e进行入队
bool CircularQueueEn(pCircularQueue Q, ElemType e);
//5、判断循环队列是否为空
bool CircularQueueIsEmpty(pCircularQueue Q);
// 6、遍历队内所有元素
void CircularQueueTraverse(pCircularQueue Q);
//7、出队,出队元素由e返回
bool CircularQueueOut(pCircularQueue Q, ElemType &e);
//8、清空队列
void CircularQueueClear(pCircularQueue Q);
//9、销毁队列
void circularQueueDestory(pCircularQueue Q);

1、初始化循环队列

2、返回队列中已有元素个数

int CircularQueueLength(pCircularQueue Q)
{return (Q->rear - Q->front + MAX_SIZE) % MAX_SIZE;
}

3、判断循环队列是否为满

4、将元素e进行入队

bool CircularQueueEn(pCircularQueue Q,ElemType e)
{if (CircularQueueIsFull(Q)){printf("队列已满,入队失败!\n");return false;}Q->pBase[Q->rear] = e;Q->rear = (Q->rear + 1) % MAX_SIZE;return true;
}

5、判断循环队列是否为空

bool CircularQueueIsEmpty(pCircularQueue Q)
{if (Q->front == Q->rear)return true;elsereturn false;
}

6、遍历队内所有元素

void CircularQueueTraverse(pCircularQueue Q)
{int i = Q->front;while (i!=Q->rear){printf("  %d\n", Q->pBase[i]);i = (i+1)%MAX_SIZE;}
}

7、出队,出队元素由e返回

bool CircularQueueOut(pCircularQueue Q, ElemType &e)
{if (CircularQueueIsEmpty(Q)){printf("队列为空,出队失败!\n");return false;}e = Q->pBase[Q->front];Q->front = (Q->front + 1) % MAX_SIZE;return true;
}

8、清空队列

void CircularQueueClear(pCircularQueue Q)
{Q->front = Q->rear = 0;
}

9、销毁队列

void CircularQueueDestory(pCircularQueue Q)
{if (Q->pBase)//如果队列存在{free(Q->pBase);//释放队列所占内存}Q->pBase = NULL;//不指向任何存储空间Q->front = Q->rear = 0;
}

最后给出完整代码

// 循环队列.cpp
# include<stdio.h>
# include<malloc.h>
# include<stdlib.h>
# define MAX_SIZE 6//队列最大长度 + 1typedef int ElemType;typedef struct CircularQueue//队列参数
{int * pBase;//指向数组首地址的指针int front;//出队下标指向队列的要出队的第一个元素int rear;//入队下标,指向队列元入队元素的下一个空间
}CircularQueue, *pCircularQueue;//1、初始化循环队列
void InitCircularQueue(pCircularQueue Q);
// 2、返回队列中已有元素个数
int CircularQueueLength(pCircularQueue Q);
// 3、判断循环队列是否为满
bool CircularQueueIsFull(pCircularQueue Q);
// 4、将元素e进行入队
bool CircularQueueEn(pCircularQueue Q, ElemType e);
//5、判断循环队列是否为空
bool CircularQueueIsEmpty(pCircularQueue Q);
// 6、遍历队内所有元素
void CircularQueueTraverse(pCircularQueue Q);
//7、出队,出队元素由e返回
bool CircularQueueOut(pCircularQueue Q, ElemType &e);
//8、清空队列
void CircularQueueClear(pCircularQueue Q);
//9、销毁队列
void CircularQueueDestory(pCircularQueue Q);int main()
{CircularQueue Q;InitCircularQueue(&Q);if (CircularQueueIsEmpty(&Q)){printf("队列为空\n");}else{printf("队列不为空\n");}for (int i = 0; i < 5; i++){CircularQueueEn(&Q, 2*i);}CircularQueueTraverse(&Q);ElemType e1;for (int i = 0; i < 4; i++){if (CircularQueueOut(&Q,e1)){printf("  %d\n", e1);}        }printf("\n");CircularQueueTraverse(&Q);return 0;
}//1、初始化循环队列
void InitCircularQueue(pCircularQueue Q)
{Q->pBase = (ElemType *)malloc(sizeof(ElemType)*MAX_SIZE);if (Q->pBase==NULL){printf("内存分配失败,程序退出!\n");exit(-1);}Q->front = Q->rear = 0;
}// 2、返回队列中已有元素个数
int CircularQueueLength(pCircularQueue Q)
{return (Q->rear - Q->front + MAX_SIZE) % MAX_SIZE;
}// 3、判断循环队列是否为满
bool CircularQueueIsFull(pCircularQueue Q)
{if ((Q->rear+1)%MAX_SIZE == Q->front){return true;}return false;
}
// 4、将元素e进行入队
bool CircularQueueEn(pCircularQueue Q,ElemType e)
{if (CircularQueueIsFull(Q)){printf("队列已满,入队失败!\n");return false;}Q->pBase[Q->rear] = e;Q->rear = (Q->rear + 1) % MAX_SIZE;return true;
}//5、判断循环队列是否为空
bool CircularQueueIsEmpty(pCircularQueue Q)
{if (Q->front == Q->rear)return true;elsereturn false;
}
// 6、遍历队内所有元素
void CircularQueueTraverse(pCircularQueue Q)
{int i = Q->front;while (i!=Q->rear){printf("  %d", Q->pBase[i]);i = (i+1)%MAX_SIZE;}printf("\n");
}//7、出队,出队元素由e返回
bool CircularQueueOut(pCircularQueue Q, ElemType &e)
{if (CircularQueueIsEmpty(Q)){printf("队列为空,出队失败!\n");return false;}e = Q->pBase[Q->front];Q->front = (Q->front + 1) % MAX_SIZE;return true;
}
//8、清空队列
void CircularQueueClear(pCircularQueue Q)
{Q->front = Q->rear = 0;
}
//9、销毁队列
void CircularQueueDestory(pCircularQueue Q)
{if (Q->pBase)//如果队列存在{free(Q->pBase);//释放队列所占内存}Q->pBase = NULL;//不指向任何存储空间Q->front = Q->rear = 0;
}

数据结构笔记(十)-- 循环队列相关推荐

  1. 数据结构与算法 | 循环队列

    循环队列 实际中我们还会用到一种队列叫做循环队列,这种队列把存储空间前后连接起来,形成像环一样的结构,解决了内存空间浪费的问题 这里我们用顺序结构来实现,因为为了防止溢出的情况,这里我们需要多开一个数 ...

  2. 【数据结构笔记06】队列及其顺序存储、链式存储

    本次笔记内容: 2.3.1 队列及顺序存储实现 2.3.2 队列的链式存储实现 文章目录 什么是队列 队列的顺序存储实现 循环队列 队列的链式存储实现 什么是队列 队列(Queue):具有一定操作约束 ...

  3. 三星手机电池循环清零代码_数据结构(C语言)-循环队列基本操作

    队列是一种先进先出(first in first out,FIFO)的线性表,是一种常用的数据结构. 它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列 ...

  4. 数据结构(c/c++)—循环队列的判断空满方式

    文章目录 前言 队列的数据结构 初始化 一.舍弃空间 二.不舍弃空间 1.计数器 2.设置标志位 前言 我们这里一共三个方法,通过是否舍弃空间来实现队列空满的判断. 队列的数据结构 const int ...

  5. 【数据结构】顺序循环队列及其实现(C语言)

    给定一个大小为MAXSIZE的数组储存一个队列,经过若干次的插入和删除以后,当队尾指针 rear = MAXSIZE 时,呈现队列满的状态,而事实上数组的前部可能还有空闲的位置.为了有效地利用空间,引 ...

  6. 2021 - 9 下旬 数据结构-线性表-循环队列-java实现代码

    //循环队列,本质就是用动态数组实现的,且出队入队时间复杂度均O(1)的队列 //相比普通队列,增设一个front指针,代表队头,代表下一个出队的元素 //循环队列的重点在于队头队尾的元素的下标的计算 ...

  7. 数据结构之顺序循环队列

    顺序循环队列 思维导图: 队列的定义: 队列的特点 队列的基本操作: 顺序循环队列基本操作的实现: 情况一:rear和front指向同一位置时 队列定义: 队列初始化: 入队: 出队: 队列判空: 返 ...

  8. 数据结构基础(7) --循环队列的设计与实现

    队列 队列简称队, 也是一种操作受限的线性表, 只允许在表的一端进行插入, 而在表的另一端进行删除.其特点为"先进先出(FIFO)",故又称为先进先出的线性表,简单队列如图所示: ...

  9. 数据结构初学之循环队列补充

    求循环队列的长度 分析: 1.当队尾指针rear指向的结点的位置下标大于队头指针front指向的结点的位置下标时(即队尾指针在队头指针的后面时), 队列的长度为len = rear - front; ...

  10. 数据结构c语言循环队列代码,数据结构C语言实现----循环队列

    代码如下: #include #include typedef char ElemType; #define MAXQUEUE 100 typedef struct { ElemType *base; ...

最新文章

  1. vba代码编程800例_VBA编程常用“积木”过程代码Address的含义
  2. golang 调用c代码
  3. JAVA socket编程实例 转载
  4. POJ 3417 Network
  5. JVM调优:图解对象内存分配过程
  6. Angular自学笔记(?)属性型指令
  7. loadrunner发送json_Loadrunner模拟JSON接口请求进行测试
  8. vs code快捷键修改为idea快捷键
  9. html______1
  10. C#项目”XXXXX”针对的是”.NETFramework,Version=v4.7.1”但此计算机没有安装它
  11. Java-RPC通信--HSF框架
  12. 医用自动配药柜的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  13. 创业公司系统安全的搭建
  14. Vmware私有云平台搭建(1)
  15. 网站信息的采集系列(一)--基本流程
  16. 70句计算机英语,70句成人英语日常口语大全
  17. warning/error
  18. 【CSRF漏洞-01】跨站请求伪造漏洞靶场实战
  19. 01.精益敏捷项目管理——敏捷开发者指南笔记
  20. ElementUI 年份范围选择器

热门文章

  1. bzoj 1833: [ZJOI2010]count 数字计数(数字0-9的个数)
  2. [python] 字典 pop(key)函数:删除字典中key及其值,并返回该值
  3. 吴恩达神经网络和深度学习-学习笔记-11-Momentum梯度下降法
  4. java中的文件操作:读取写入byte[]字节流、string字符串、list列表
  5. NMS(Non-maximum suppression)非极大抑制
  6. 详解汇编里的单步中断-T使用寄存器标志位TF和IF
  7. 在Linux系统上安装Spring boot应用
  8. golang中值类型/指针类型的变量区别总结
  9. vue为app做h5页面,如何做到同域名对应不同版本的h5代码
  10. 引用数据类型Scanner,Random