循环队列/顺序队列(C++)
队列(queue)是一种限定存取位置的线性变。他允许在表的一端插入,在另一端删除。这个和计算机调度策略中的先来先服务FCFS(First Come/First Served)是一样的。队列中可以插入的一端为队尾(rear),允许删除的一端称为队头(front)。

队列也分为两种,一种是用数组的存储表示,一种是基于链表的存储表示。
基于数组的存储表示的队列被称为顺序队列。其数据成员包括,一维数组elements用来存储数据,指针front和rear用来指示队尾队头的位置,maxSize是数组的最大长度。

从上边的图可以看出来,rear指针到指到数组最后一位时就不能继续往后添加元素,如果之前删除过元素,front指针前还有空闲的空间未被使用,造成空间的浪费。所以,使队列循环起来就可以使其最大限度的利用空间。

变成循环队列,为了避免越界,每次添加新元素时,尾指针需要加一后对堆长取余
即 rear = (rear+1)%maxSize;
删除元素也一样
front = (front+1)%maxSize;
为了区别于空队列,用(rear+1)%maxSize==front来判断是否队满,即队尾走到队头前一个位置即判定队满。再因为队尾所指的空间为最后一个元素的下一个位置,所以循环队列最多能存放maxSize-1个元素。
//queue.h
#ifndef _QUEUE_H
#define _QUEUE_H
#include<iostream>
using namespace std;
const int maxSize = 50;
template<class T>
class Queue
{
public:
Queue(){};
~Queue(){};
virtual bool EnQueue(const T& x) = 0;
virtual bool DeQueue(T& x) = 0;
virtual bool getFront(T& x) = 0;
virtual bool IsEmpty()const = 0;
virtual bool IsFull()const = 0;
virtual int getSize()const = 0;
};
#endif
//main.cpp
#include<assert.h>
#include"queue.h"
template<class T>
class SeqQueue;
template<class T>
ostream& operator<< (ostream& out, SeqQueue<T>& Q)//将友元函数声明在前可以避免其警告友元函数未声明
{
cout<<"front = "<<Q.front<<", rear = "<<Q.rear<<endl;
if(!Q.IsEmpty())
{
int i = Q.front;
while(i!=Q.rear)
{
cout<<Q.elements[i]<<" | ";
i = (++i)%maxSize;
}
}
return out; } template<class T>
class SeqQueue: public Queue<T>
{
private:
int rear, front;
T *elements;
int maxSize;
public:
SeqQueue(int sz=10);//构造函数
~SeqQueue(){delete[] elements;}//析构函数
bool EnQueue(const T& x);//入队列
bool DeQueue(T& x);//出队列
bool getFront(T& x);//找队头
bool IsEmpty()const{return (this->rear==this->front) ? true : false;}//判空
bool IsFull()const{return ((this->rear+1)%this->maxSize==this->front) ? true : false;}//判满
int getSize()const{return(this->rear-this->front+this->maxSize)%this->maxSize;}//得队长
friend ostream& operator<<<>(ostream& out, SeqQueue<T>& Q);
//void print();
};
/*template<class T>
void SeqQueue<T>::print()
{
if(!this->IsEmpty())
{
int i = this->front;
while(i!=this->rear)
{
cout<<this->elements[i]<<" | ";
i = (++i)/this->maxSize;
}
}
}*/
template<class T>
bool SeqQueue<T>::EnQueue(const T& x)
{
if(!this->IsFull())
{
this->elements[this->rear] = x;
this->rear = (this->rear+1)%this->maxSize;
return true;
}
return false;
}
template<class T>
bool SeqQueue<T>::DeQueue(T& x)
{
if(!this->IsEmpty())
{
x = this->elements[this->front];
this->front = (this->front+1)%this->maxSize;
return true;
}
return false;
}
template<class T>
bool SeqQueue<T>::getFront(T& x)
{
if(!this->IsEmpty())
{
x = this->elements[this->front];
return true;
}
return false;
}
template<class T>
SeqQueue<T>::SeqQueue(int sz):front(0),rear(0),maxSize(sz)
{
this->elements = new T[maxSize];
assert(this->elements!=NULL);
}
int main()
{
SeqQueue<int> Q(7);
for(int i=7; i>0; --i)
Q.EnQueue(i);
cout<<Q<<endl;//声明友元函数并重载输出运算符<<就可以用cout直接输出对象
int q = 0;
for(int i=3; i>=0; --i)
Q.DeQueue(q);
cout<<Q<<endl;
cout<<"Size = "<<Q.getSize()<<endl;
return 0;
}
运行结果

循环队列/顺序队列(C++)的更多相关文章
- Javascript数据结构与算法--队列(顺序队列、优先队列、循环队列)的实现与用法
前言 队列和栈非常类似,前面已经讲过了栈的实现与用法,现在我们来说说队列. 队列介绍 队列遵循FIFO(First In First Out,先进先出)原则的一组有序的项. 队列是一种特殊的线性表,特 ...
- javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例
1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
- 数据结构----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
- 用数组实现队列(顺序队列&循环队列)
用数组实现队列(顺序队列&循环队列) 顺序队列 ️ 队列(先进先出) 几个问题: 队列方法:入队.出队 队列的存储:即队首队尾两个指针, 扩容:如果队列容量不够了,应该扩容,如果队尾没有位置了 ...
- C语言顺序队列
顺序队列是一种只能在一头进和另一头出的数据结构,所以结构体里设2个指针分别指向头部和尾部,用数组来存储数据. #define MAXSIZE 1024 typedef int elemtype; ty ...
- 总结:JavaScript异步、事件循环与消息队列、微任务与宏任务
本人正在努力学习前端,内容仅供参考.由于各种原因(不喜欢博客园的UI),大家可以移步我的github阅读体验更佳:传送门,喜欢就点个star咯,或者我的博客:https://blog.tangzhen ...
- 数据结构 - 顺序队列的实行(C语言)
数据结构-顺序队列的实现 1 顺序队列的定义 线性表有顺序存储和链式存储,队列作为一种特殊的线性表,也同样存在这两种存储方式.我们先来看队列的顺序存储结构. 队列的顺序储存结构:用数组存储队列,为了避 ...
- 数据结构之顺序队列(C实现)
一.队列是什么 队列是一种可以实现“先进先出”的存储结构. 队列通常可以分为两种类型: 一.顺序队列,采用顺序存储,当长度确定时使用. 顺序队列又有两种情况: ①使用数组存储队列的称为静态顺序队列. ...
随机推荐
- es6使用场景
es6非空判断 示例1 es5 if(value !== null && value !== undefined && value !== ''){ //... } e ...
- 二.什么是Promise
二.什么是Promise 1.理解 2.promise 的状态改变 3.promise的基本流程 4.promise的基本使用 1.理解 抽象表达: Promise 是JS 中进行异步编程的新的解决方 ...
- 自动下载MarkDown格式会议论文的程序
近期师兄发给我一个压缩包让我整理文献,而我发现压缩包里的内容是这样: 这样: 和这样的: 我大概看了一下,可能有270多篇文章是这种格式,俗话说的好,没有困难的工作,只有勇敢的研究僧.所以决定用Pyt ...
- 来了!公开揭密团队成员开发鸿蒙 OpenHarmony 的完整过程(收获官方7000奖金和开发板等,1w字用心总结)
背景 随着 OpenHarmony 组件开发大赛结果公布,我们的团队成员被告知获得了二等奖,在开心之余也想将我们这段时间宝贵的开发经验写下来与大家分享,当我们看到参赛通知的时候已经是 9 月中旬的时候 ...
- 说透 Docker:基础
既然要学习 K8S,相信各位读者都已经使用过 Docker 了,Docker 的入门是比较容易的,但 Docker 的网络和存储.虚拟化是相当复杂的,Docker 的技术点比较多,在本章中将会深入介绍 ...
- requests的get请求基本使用
官方文档 https://docs.python-requests.org/zh_CN/latest/ 快速上手 https://docs.python-requests.org/zh_CN/la ...
- java web 在线编辑Excel -- x-spreadsheet
--- x-spreadsheet --- 文档 https://hondrytravis.com/x-spreadsheet-doc/ <%@ page language="java ...
- python实现开闭操作
目录: 开闭操作的作用 (一)开操作 (二)闭操作 (三)开操作完成其他任务 (1)提取水平垂直线 (2)消除干扰线 (3)提取满足要求的形状 开闭操作的作用: (一)开操作(特点作用:消除噪点--- ...
- [bzoj1305]跳舞
考虑如果没有k个人,那么就是裸的二分答案+最大流对于这k个人,再在原来的每一个点裂点,中间的流量为k,然后裂出来的点向所有不能匹配的点连边,再二分答案+最大流即可 1 #include<bits ...
- [nowcoder5668I]Sorting the Array
令$f(n,b,m)=a[1..n]$(这里下标从1开始),考虑一些性质: 性质1.对于$\forall 1\le i\le n-m+1$,若$\exists 1\le j<i,a[j]> ...