前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >循环队列---c++版本

循环队列---c++版本

作者头像
大忽悠爱学习
发布2021-03-11 11:10:02
5410
发布2021-03-11 11:10:02
举报
文章被收录于专栏:c++与qt学习

原先操作

在这里插入图片描述
在这里插入图片描述

改进版本:

在这里插入图片描述
在这里插入图片描述

假溢出

在这里插入图片描述
在这里插入图片描述

解决方法:

在这里插入图片描述
在这里插入图片描述

如何实现循环队列

在这里插入图片描述
在这里插入图片描述

判断循环队列为空

在这里插入图片描述
在这里插入图片描述

判断循环队列为满

在这里插入图片描述
在这里插入图片描述

存在问题:队空和堆满的判断条件重复

解决方法:

在这里插入图片描述
在这里插入图片描述

这里选择第二种方法:

在这里插入图片描述
在这里插入图片描述

循环队列类的定义

在这里插入图片描述
在这里插入图片描述

入队操作

在这里插入图片描述
在这里插入图片描述

出队操作

在这里插入图片描述
在这里插入图片描述

读取队头元素

在这里插入图片描述
在这里插入图片描述

注意:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:当进行元素删除操作后,从front位置开始后一个元素,直到rear部分是当前数组中存储的有效数据(左开右闭,从左到右)

front从左边开始的元素一直到rear为剩余数组中可用的空间

front位置的元素空间无法访问,被浪费掉了

queue.hpp

代码语言:javascript
复制
#include<iostream>
using namespace std;
#include<cmath>
#define MAX 100 //队列默认最大长度
template<class Data>
class cirQueue 
{
private:
	Data* val;//指向在堆区开辟的用户自定义类型的数组
	int front;
	int rear;
	int mysize;//用户自己决定队列大小
public:
	cirQueue() {
		mysize = MAX;
		front = -1;
		rear = -1;
		val = new Data[MAX];
	}
	cirQueue(int size) {
		mysize = size;
		front = -1;
		rear = -1;
		val = new Data[mysize];
	}
	~cirQueue() {
		delete[] val;
		val = NULL;
	}
	//值传递,将传入的元素拷贝到数组中
	bool enQueue(Data item);
    //bool是判断插入删除是否成功
	bool deQueue();
	Data getTop();
	bool isEmpty();
	bool isFull();
	void clear();
	//因为这里定义的是类模板,输出什么,应该由用户决定
	//void display();
	int length();
};
template<class Data>
bool cirQueue<Data>::enQueue(Data item)
{
	//先判断队列是否满了
	if (isFull())
	{
		return false;
	}
	//rear指向当前数组中最后一个元素,我们插入元素时,需要先更新rear下标,即把rear的位置移动到下一个位置,再在下一个位置插入新元素
	rear = (rear + 1) % mysize;
	val[rear] = item;
	return true;
}
template<class Data>
bool cirQueue<Data>::deQueue()
{
	//先判断队列是否为空
	if (isEmpty())
	{
		return false;
	}
	//每一次都是删除都相当于对队列的第一个元素进行删除,即front后面的第一个元素
	//更新front的坐标到删除后的当前数组中第一个元素的前面一个位置,即fornt处于原先队列被删除的第一个元素的位置
	front = (front + 1) % mysize;
	return true;
}
template<class Data>
Data cirQueue<Data>::getTop()
{
	int i = (front + 1) % mysize;
	Data temp = val[i];
	return temp;
}
template<class Data>
bool cirQueue<Data>::isEmpty()
{
	if (front == rear)
		return true;
	return false;
}
template<class Data>
bool cirQueue<Data>::isFull()
{
	if ((rear + 1) % mysize == front)
		return true;
	return false;
}
template<class Data>
void cirQueue<Data>::clear()
{
	//清空队列,相当于给队列置空
	front = -1;
	rear = -1;
}
template<class Data>
int cirQueue<Data>::length()
{
  //求长度:绝对值
	int len=abs(rear - front);
	return len;
}

main.cpp

代码语言:javascript
复制
#include<iostream>
using namespace std;
#include"queue.hpp"
//测试-------------------------
struct person {
	int age;
};
void test()
{
	person p1 = { 10 };
	person p2 = { 20 };
	person p3 = { 30 };
	person p4 = { 40 };
	cirQueue<person> q(6);
	q.enQueue(p1);
	q.enQueue(p2);
	q.enQueue(p3);
	q.enQueue(p4);
	cout << "当前队列中元素个数:" << q.length() << endl;
	while (!q.isEmpty())
	{
		person p = q.getTop();
		cout << "年龄:" << p.age << endl;
		q.deQueue();
	}
	q.clear();
	cout << "当前队列中元素个数:" << q.length() << endl;
	
}
int main()
{

	test();
	system("pause");
	return 0;
}
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原先操作
  • 改进版本:
  • 假溢出
  • 解决方法:
  • 如何实现循环队列
  • 判断循环队列为空
  • 判断循环队列为满
  • 存在问题:队空和堆满的判断条件重复
  • 解决方法:
  • 循环队列类的定义
  • 入队操作
  • 出队操作
  • 读取队头元素
  • 注意:
  • 总结:当进行元素删除操作后,从front位置开始后一个元素,直到rear部分是当前数组中存储的有效数据(左开右闭,从左到右)
  • front从左边开始的元素一直到rear为剩余数组中可用的空间
  • front位置的元素空间无法访问,被浪费掉了
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档