循环队列的实现

本文介绍了一种循环队列的数据结构,并提供了其在C++中的具体实现。包括构造函数、入队、出队、获取队头元素、判断队列是否为空及遍历队列等操作。

一、实验目的

1、   熟练掌栈和队列的结构特点,掌握栈和队列的顺序存储和链式存储结构和实现。

2、   学会使用栈和队列解决实际问题。

 

二、实验内容

确定结点的具体数据类型和问题规模:

建立一个循环队列,实现队列的入队和出队操作。

 

三、源代码

#CirQueue.h文件

 

const int QueueSize = 100;
template<class T>
class CirQueue
{
public:
	CirQueue();//构造函数,初始化空队列
	~CirQueue();//析构函数
	void EnQueue(T x);//入队操作,将元素X入队
	T DeQueue();//出队操作,将队伍元素出队
	T GetQueue();//取队头元素
	int Empty();//判断队列是否为空
	void PrintQueue();//从队头开始遍历队列
private:
	T data[QueueSize];
	int front, rear;
};

#CirQueue.cpp文件

#include"CirQueue.h"
template<class T>
CirQueue<T>::CirQueue()
{
	front = rear = QueueSize - 1;
}
template<class T>
CirQueue<T>::~CirQueue()
{
}
template<class T>
void CirQueue<T>::EnQueue(T x)
{
	if ((rear + 1) % QueueSize == front)
		throw "上溢";
	rear = (rear + 1) % QueueSize;
	data[rear] = x;
}
template<class T>
T CirQueue<T>::GetQueue()
{
	int i;
	if (rear == front)
		throw"下溢";
	i = (front + 1) % QueueSize;
	return data[i];
}
template<class T>
T CirQueue<T>::DeQueue()
{
	if (rear == front)
		throw"下溢";
	front = (front + 1) % QueueSize;
	return data[front];
}
template<class T>
int CirQueue<T>::Empty()
{
	if (front == rear)
		return 1;
	else
		return 0;
}
template<class T>
void CirQueue<T>::PrintQueue()
{
	int i;
	i = front;
	while (front != rear)
	{
		front = (front + 1) % QueueSize;
		cout << data[front] << "  ";
	}
	cout << endl;
	front = i;
}

#源.cpp文件

 

#include"CirQueue.cpp"
#include<iostream>
#include<string>
using namespace std;
int main(void)
{
	CirQueue<int> c1;
	c1.EnQueue(1);
	c1.EnQueue(2);
	c1.EnQueue(3);
	cout << c1.GetQueue() << endl;//获取队头元素
	c1.PrintQueue();//遍历队列
	cout<<c1.DeQueue()<<endl;//队头出列
	cout << c1.Empty() << endl;//判断c1是否空
	c1.DeQueue();
	c1.DeQueue();
	cout << c1.Empty() << endl;//判断c1是否空
	system("pause");
	return 0;
}

实验截图如下:

 

四、实验心得

通过这次实验,发现自己的循环队列有了清晰的认识,也没遇到什么困难。

 

 

 

### 循环队列的数据结构 循环队列是一种特殊的线性数据结构,其操作遵循先进先出 (FIFO) 原则。它通常基于数组实现,利用环形设计优化存储间利用率并提高效率[^1]。 #### 数据结构特点 - **固定大小的数组**:循环队列依赖于一个固定长度的数组作为底层存储容器。 - **头指针 (`front`)** 和 **尾指针 (`rear`)**:分别用于指示当前队首位置和即将插入新元素的位置。 - **模运算处理边界条件**:当 `rear` 或 `front` 达到数组末尾时,通过取模运算将其重置为起始索引,从而形成逻辑上的“环”。 --- ### 实现方法 以下是基于数组实现循环队列的核心要点: #### 判断队列或满的状态 - 队列为 **** 的条件是: \[ front = rear \] - 队列为 **满** 的条件可以通过预留一个额外的间表示状态,即满足以下关系时认为队列已满: \[ (rear + 1) \% size = front \] 这种策略可以有效区分队列与满的情况[^3]。 #### 核心函数实现 下面是一个简单的 Python 版本的循环队列实现示例: ```python class CircularQueue: def __init__(self, capacity): self.queue = [None] * capacity # 初始化固定大小的数组 self.capacity = capacity # 容量 self.front = 0 # 头部指针 self.rear = 0 # 尾部指针 def is_empty(self): # 判断队列是否 return self.front == self.rear def is_full(self): # 判断队列是否已满 return (self.rear + 1) % self.capacity == self.front def enqueue(self, item): # 入队操作 if self.is_full(): raise Exception("Queue is full") # 如果队列满了,则抛出异常 self.queue[self.rear] = item # 插入元素 self.rear = (self.rear + 1) % self.capacity # 更新尾指针 def dequeue(self): # 出队操作 if self.is_empty(): # 如果队列,则抛出异常 raise Exception("Queue is empty") item = self.queue[self.front] # 获取队首元素 self.front = (self.front + 1) % self.capacity # 更新头指针 return item # 返回被移除的元素 ``` 上述代码展示了如何定义一个基本的循环队列及其核心功能[^2]。 --- ### 总结 循环队列通过巧妙地运用数组和模运算解决了传统线性队列中的存储浪费问题,同时提供了高效的入队和出队操作。在实际开发中,可以根据具体需求调整其实现细节,例如动态扩展容量或者支持多线程环境下的并发访问。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值