首页 > 编程语言 >c++ - 实现环形队列

c++ - 实现环形队列

时间:2024-01-30 16:44:07浏览次数:18  
标签:iQueueLen 队列 环形 c++ int bool MyQueue iHead

简介

队列的核心思想是FIFO(First In First Out),即先入先出。

入队(新增元素)必须从队尾加入,出队(删除元素)必须从队首出去。

实现

1、需要实现的方法

#pragma once
#include<iostream>
using namespace std;
#ifndef MYQUEUE_H
#define MYQUEUE_H
//环形队列的实现
class MyQueue
{
public:
    MyQueue(int queueCapacity);//创建队列
    virtual ~MyQueue();//销毁队列
    void ClearQueue();//清空队列
    bool QueueEmpty() const;//判空队列
    bool QueueFull() const;//判满队列
    int QueueLength() const;//队列长度
    bool EnQueue(int element);//新元素入队
    bool DeQueue(int &element);//首元素出队
    void QueueTraverse();//遍历队列
private:
    int *m_pQueue;//队列数组指针
    int m_iQueueLen;//队列元素个数
    int m_iQueueCapacity;//队列数组容量
    int m_iHead;
    int m_iTail;
};

2、构造函数

队列容量作为参数传入;

声明指向数组的指针,赋予容量;

清空队列的方法如“3.清空队列的实现”

MyQueue::MyQueue(int queueCapacity)
{
    m_iQueueCapacity = queueCapacity;
    m_pQueue = new int[m_iQueueCapacity];
    ClearQueue();
}

3、析构函数

 删除指针,并置空。因为是指向数组的指针,使用delete[]

MyQueue::~MyQueue()
{
    delete[] m_pQueue;
    m_pQueue = NULL;
}

4、清空队列

将队首置为0,队尾置0,队列长度置0

void MyQueue::ClearQueue()
{
    m_iHead = 0;
    m_iTail = 0;
    m_iQueueLen = 0;
}

5、判断空与满

判空:长度等于0返回正确的结果,否则错误
判满:长度等于容量返回正确的结果,否则错误

bool MyQueue::QueueEmpty() const
{
    return m_iQueueLen == 0 ?  true : false;
}

bool MyQueue::QueueFull() const
{
    return m_iQueueLen == m_iQueueCapacity ? true : false;
}

6、长度

bool MyQueue::QueueEmpty() const
{
    return m_iQueueLen == 0 ?  true : false;
}

7、入队

如果队列已满,不允许入队
如果队列未满,传入需要加入的参数
将数组[队尾]置为传入的元素
队尾++
队列长度++
队尾对容量进行取余,防止队尾溢出,一旦队尾大于等于4,就会回归到0-4之间的数,从而达到环形队列的目的

bool MyQueue::EnQueue(int element)
{
    if (QueueFull())
    {
        return false;
    }
    else {
        m_pQueue[m_iTail] = element;
        m_iTail++;
        m_iTail = m_iTail % m_iQueueCapacity;
        m_iQueueLen++;
        return true;
    }
}

8、出队

如果队列为空,不允许出队
如果队列不为空,允许出队
把即将删除的数组[队首]赋值给引用,队首++,出队的元素下一个成为新的队首元素
队首对容量进行取余操作,防止溢出队列容量
队列长度--
PS:这里的引用是为了获取到实参的值,这个参数并不会影响到队列数据,实际上是为了返回这个实参,相当于int MyQueue::Dequeue(){return element},但是这里需要返回类型是bool,又想得到实参的值,只能传入引用了,这个特性在Java里面不存在。

bool MyQueue::DeQueue(int &element) //传入引用是为了可以直接修改实参的值,
{
    if (QueueEmpty())
    {
        return false;
    }
    else {
        element = m_pQueue[m_iHead] ;
        m_iHead++;
        m_iHead = m_iHead % m_iQueueCapacity;
        m_iQueueLen--;
        return true;
    }
}

9、遍历

因为要循环m_iQueueLen次,所以队列长度要加上m_iHead(队首),i对容量取余防止队列容量溢出

void MyQueue::QueueTraverse()
{
    for (int i = m_iHead; i < m_iQueueLen + m_iHead; i++)
    {
        cout << m_pQueue[i%m_iQueueCapacity] << endl;
    }
}

 

转载自:https://www.cnblogs.com/Java-Starter/p/9389752.html

标签:iQueueLen,队列,环形,c++,int,bool,MyQueue,iHead
From: https://www.cnblogs.com/citrus/p/17997432

相关文章

  • C++ 避免不必要的复制进行优化的思路
    对于函数传入的参数,如果只是需要读取其中的值,一般来说,除了基础的int类型这种,建议声明为const&类型,这样避免不必要的复制操作。特殊的,std::vector进行增加元素时,可以考虑使用vec[0]=std::move(value),通过转移所有权来避免复制操作,因为vec[0]=value也存在复制操作。不......
  • 【C++】c++中的输入输出;缺省;重载;
    1、c++输入输出#include<iostream>//std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中usingnamespacestd;intmain(){ cout<<"Helloworld!!!"<<endl; return0;}//流插入运算符<<在一个语句中可以多次使用,如上面实例中所示,endl用于在行末添加......
  • c++ cast
    static_caststatic_cast(expression)用于非多态类型的低风险转换,如基类和派生类之间的转换,基本数据类型之间的转换(包括任何隐式转换),用户自定义转换,把void指针转换成目标类型的指针等。不进行运行时类型检查,只在编译时检查。具体如下用于类层次结构中基类和派生类之间指针......
  • Visual Studio部署C++矩阵库Armadillo的方法
      本文介绍在VisualStudio软件中配置C++环境下线性代数运算库Armadillo的方法。  首先,我们需要在Armadillo库官网下载其源代码,直接点击下图所示红色框内部分即可。  点击上图所示位置后,将弹出一个新的下载界面;Armadillo库的源代码将随后自动下载。  接下来,我们在Vis......
  • C++多态
    多态的概念多态(Polymorphism)是面向对象编程中的一个重要概念,它允许同一类型的对象在不同的上下文中表现出不同的行为。多态性有两种主要形式:编译时多态(静态多态性)和运行时多态(动态多态性)。编译时多态可以看成是函数重载和运算符重载,之前的文章已经涉及过,不再赘述;所以,下面所提到的多......
  • C++实现直接插入排序、冒泡排序、快速排序、选择排序(含调试程序)
    #include<iostream>#include<fstream>#include<string>#include<vector>#include<algorithm>usingnamespace::std;classSolution{public: //直接插入排序 voidinsertsort(vector<int>&num){ for(inti=1;i<num......
  • C++ Qt开发:运用QJSON模块解析数据
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QJson组件的实现对JSON文本的灵活解析功能。JSON(JavaScriptObjectNotation)是一种轻量级......
  • 有关UE5在VisualStudio升级后产生C++无法编译的问题及处理方案
    哈喽大家好,我是咕噜美乐蒂,很高兴又见面啦!最近,许多使用UE5的游戏开发者遇到了一个问题:在VisualStudio升级后,他们的C++代码无法编译。这个问题可能是由于UE5工程和VS之间的版本不兼容导致的。本文将深入探讨这个问题的原因以及如何解决它。一、问题的产生原因UE5是一款基于C++的游戏......
  • 数据结构——队列链式存储实现
    队列链式存储主要有两个方面需要注意,一个是定义时应该定义两种结构体,一个是具体节点,一个是队列本身。具体节点用于存储具体数据data和指向下一个节点的指针*next。而队列本身的结构体只会储存两个具体节点的指针,一个指向队头,一个指向队尾。第二个需要注意的是,出队操作,对于只剩......
  • 优先级队列的应用 I
    目录1.题目列表2.应用2.1.Leetcode295.数据流的中位数2.1.1.题目2.1.2.解题思路2.1.3.代码实现1.题目列表题目列表:序号题目难度1295.数据流的中位数困难2.应用2.1.Leetcode295.数据流的中位数2.1.1.题目295.数据流的中位数中位数是......