循环队列的实现

const int QueueSize = 100;
template<class T>
class CirQueue{
public:
    CirQueue();
    ~CirQueue();
    void EnQueue(T x);
    T DeQueue();
    T GetHead();
    int Empty();
private:
    T data[QueueSize];
    int front,rear;
};

构造函数

初始化一个空的循环队列只需要将队头front和队尾rear同时指向数组的某一个位置,一般是数组的高端,即front=rear=QueueSize-1;

template<class T>
CirQueue<T>::CirQueue(){
    front=rear=QueueSize-1;
}

析构函数

因为循环队列是静态存储分配的,在循环队列变量退出作用域时自动释放所占的内存单元,因此,循环队列无需销毁,析构函数为空。

入队

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>::DeQueue(){
    if(rear==front) throw "下溢";
    front=(front+1)%QueueSize;
    return data[front];
}

取队头

template<class T>
T CirQueue<T>::GetHead(){
    if(rear==front) throw "下溢";
    return data[(front+1)%QueueSize];
}

完整代码

const int QueueSize = 100;
template<class T>
class CirQueue{
public:
    CirQueue();
    ~CirQueue();
    void EnQueue(T x);
    T DeQueue();
    T GetHead();
    int Empty();
private:
    T data[QueueSize];
    int front,rear;
};
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>::DeQueue(){
    if(rear==front) throw "下溢";
    front=(front+1)%QueueSize;
    return data[front];
}
template<class T>
T CirQueue<T>::GetHead(){
    if(rear==front) throw "下溢";
    return data[(front+1)%QueueSize];
}
template<class T>
int CirQueue<T>::Empty(){
    return rear==front?1: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]。 --- ### 总结 循环队列通过巧妙地运用数组和模运算解决了传统线性队列中的存储浪费问题,同时提供了高效的入队和出队操作。在实际开发中,可以根据具体需求调整其实现细节,例如动态扩展容量或者支持多线程环境下的并发访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值