1 队列的定义

队列是只允许在一端(队尾)进行插入操作,而在另一端(队头)进行删除操作的线性表。

2 队列的特点

1)先进先出是队列最大的特点,是应用中非常常见的模型,例如排队;

2)队列也属于线性表,线性表的特性队列都拥有。

3 循环队列的实现及关键点

3.1 关键点

1)队列为空的条件:队头指针等于队尾指针,即head == tial;

2)队列中保留一个元素空间,当队列满时,尾指针和头指针之间还剩一个元素空间。队列为满的条件:(tial + 1) % quenceSize == head;

3)队列中元素个数为:(tial + quenceSize - head) % quenceSize。

3.2 实现

 #ifndef CYCLESQUENCE_H
#define CYCLESQUENCE_H typedef int ElemType; class CycleQuence {
private:
ElemType* m_pData; //数组地址
int m_nHead; //首元素位置
int m_nTial; //尾元素位置
int m_nMaxSize; //数组长度 public:
CycleQuence(int maxSize);
~CycleQuence();
void ClearQuence() { m_nHead = , m_nTial = ; } //清空队列
bool EnterQuence(ElemType elem); //入队
bool DeleteQuence(ElemType* pElem); //出队
void VisitQuence() const; //查看队列元素
bool IsEmpty() const { return m_nHead == m_nTial; } //判断是否为空
bool IsFull() const { return m_nHead == (m_nTial + ) % m_nMaxSize; } //判断是否为满
}; #endif
 #include "pch.h"
#include "CycleSquence.h"
#include <iostream> CycleQuence::CycleQuence(int maxSize)
{
m_nHead = ;
m_nTial = ;
m_nMaxSize = maxSize;
m_pData = new ElemType[maxSize];
} CycleQuence::~CycleQuence()
{
delete[] m_pData;
} bool CycleQuence::EnterQuence(ElemType elem) //入队
{
if (IsFull()) //队满
{
std::cout << "The quence is full." << std::endl;
return false;
} m_pData[m_nTial] = elem;
m_nTial = (m_nTial + ) % m_nMaxSize;
VisitQuence(); return true;
} bool CycleQuence::DeleteQuence(ElemType* pElem) //出队
{
if (IsEmpty()) //队空
return false; *pElem = m_pData[m_nHead];
m_nHead = (m_nHead + ) % m_nMaxSize;
VisitQuence(); return true;
} void CycleQuence::VisitQuence() const //查看队列元素
{
std::cout << "The element of quence: ";
for (int i = m_nHead, j = ; j < (m_nTial + m_nMaxSize - m_nHead) % m_nMaxSize; i = (i + ) % m_nMaxSize, ++j)
std::cout << m_pData[i] << ' ';
std::cout << std::endl;
}

测试代码(Visual Studio 2017上测试):

 #include "pch.h"
#include "CycleSquence.h"
#include <iostream> int main()
{
CycleQuence quence();
quence.EnterQuence();
quence.EnterQuence();
quence.EnterQuence();
quence.EnterQuence();
ElemType elem;
quence.DeleteQuence(&elem);
quence.DeleteQuence(&elem);
quence.DeleteQuence(&elem);
quence.EnterQuence();
quence.EnterQuence();
quence.EnterQuence();
quence.EnterQuence(); return ;
}

测试结果:

在写VisitQuence()这个方法时,想了好一会儿,就是想可不可以用一个变量遍历队列。但是其实没必要这样,代码在执行效率差不多的情况下,更要注重清晰易懂,简洁的代码有时更容易让人费解。

4 队列的链式存储的实现和关键点

4.1 关键点

1)链队列为空的条件为:head == tial;

2)队列的链式存储通过单链表实现,尤其注意入队、出队操作。

4.2 实现

略。

该篇博客是自己的学习博客,水平有限,如果有哪里理解不对的地方,希望大家可以指正!

队列(FIFO)—循环队列、队列的链式存储的更多相关文章

  1. 队列的顺序存储与链式存储c语言实现

    一. 队列 1.队列定义:只允许在表的一端进行插入,表的另一端进行删除操作的线性表. 2.循环队列:把存储队列的顺序队列在逻辑上视为一个环. 循环队列状态: 初始时:Q.front=Q.rear=0 ...

  2. C++编程练习(6)----“实现简单的队列的链式存储结构“

    队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出.简称链队列. 实现代码如下: /* LinkQueue.h 头文件 */ #include<iostream> #defi ...

  3. 队列链式存储 - 设计与实现 - API函数

    队列相关基础内容参我的博文:队列顺序存储 - 设计与实现 - API函数 队列也是一种特殊的线性表:可以用线性表链式存储来模拟队列的链式存储. 主要代码: // linkqueue.h // 队列链式 ...

  4. [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)

    优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...

  5. Java实现链式存储的二叉查找树(递归方法)

    二叉查找树的定义: 二叉查找树或者是一颗空树,或者是一颗具有以下特性的非空二叉树: 1. 若左子树非空,则左子树上所有节点关键字值均小于根节点的关键字: 2. 若右子树非空,则右子树上所有节点关键字值 ...

  6. Java实现链式存储的二叉树

    二叉树的定义: 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 二叉树的遍历方式主要 ...

  7. C#数据结构-二叉树-链式存储结构

    对比上一篇文章"顺序存储二叉树",链式存储二叉树的优点是节省空间. 二叉树的性质: 1.在二叉树的第i层上至多有2i-1个节点(i>=1). 2.深度为k的二叉树至多有2k- ...

  8. c数据结构 -- 线性表之 复杂的链式存储结构

    复杂的链式存储结构 循环链表 定义:是一种头尾相接的链表(即表中最后一个结点的指针域指向头结点,整个链表形成一个环) 优点:从表中任一节点出发均可找到表中其他结点 注意:涉及遍历操作时,终止条件是判断 ...

  9. javascript实现数据结构:线性表--线性链表(链式存储结构)

    上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...

随机推荐

  1. ubuntu文件系统分区调整(解决目录空间不足、分配不均问题)

    1. 安装 tuxboot (ubuntu下烧写工具) sudo apt-add-repository ppa:thomas.tsai/ubuntu-tuxboot sudo apt-get upda ...

  2. 你觉得 .NET 性能低,可能只是因为你的能力低

    by Conmajia 本文由以下大佬赞助 加入赞助者行列 {{ sponsor.name }} 感恩,你们的赞助让我在抓耳挠腮写文章时不至于断了香烟. var s = [{ name: '◎梦想起航 ...

  3. 用.net写Textbox控件关于数字的判断的二则方法

    方法一.使用textboxSelected事件进行判断首界面源码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  4. 杭电ACM2020--绝对值排序

    输入n(n<=100)个整数,按照绝对值从大到小排序后输出.题目保证对于每一个测试实例,所有的数的绝对值都不相等.   Input 输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整 ...

  5. K2开发中,遇到用户无权限OPEN当前的待办

    1.用户有的时候在做操作时,提示用户没有权限OPEN当前流程,需要注意判断当前用户是K2标签还是K2SQL标签.如果标签不对,会导致当前问题的发生 后续如果再有碰到,再补充吧

  6. Spring中关于AOP的实践之概念

    一.什么是AOP AOP:也称作面向切面编程 在分享几个概念执行我想先举个栗子(可能例子举得并不是特别恰当): 1.假如路人A走在大街上,被一群坏人绑架了: 2.警察叔叔接到报警迅速展开行动:收集情报 ...

  7. H5、C3、ES6的新特性

    H5的新特性 1.语义化标签 有利于SEO,有助于爬虫抓取更多的有效信息,爬虫是依赖于标签来确定上下文和各个关键字的权重. 语义化的HTML在没有CSS的情况下也能呈现较好的内容结构与代码结构 方便其 ...

  8. K3实现按虚拟件/组件发料

           最近公司调度部反应了一个K3使用过程中遇到的巨大问题:公司成品BOM组成物料种类破千,绝大部分还不能拆分成组件.为了方便区分,从逻辑上把一堆堆的半成品分成了一个个虚拟件.K3生成的投料单 ...

  9. 深入浅出ES6教程模块化

    大家好,本人名叫苏日俪格,大家叫我 (格格) 就好,在上一章节中我们学到了Promise的用法,下面我们一起来继续学习模块化: JavaScript本身是不支持模块化的,只不过后来一些社区的大佬制定了 ...

  10. canvas动态图标

    前言 canvas 强大的功能让它成为了 HTML5 中非常重要的部分,至于它是什么,这里就不需要我多作介绍了.而可视化图表,则是 canvas 强大功能的表现之一. 现在已经有了很多成熟的图表插件都 ...