了解循环队列之前, 先熟悉一下队列和链队列,这样可以更好的理解循环队列
循环队列为空的条件:(q->front == q->rear) 为空
循环队列为满的情况也是q->front == q->rear,
解决方法:空出一元素, 作为满的条件
如图:
循环队列为满的条件:(q->rear+1 == Q->front) 为满
代码实现
#include <iostream>
#include <Windows.h>
#include <stdio.h>
#define MAX_SIZE 10
// 循环队列的定义
typedef int ELEM;
typedef struct _Queue{
ELEM date[MAX_SIZE];
int front;
int rear;
}Queue;
// 队列的初始化
void initQueue(Queue& q) {
q.front = q.rear = 0;
}
//队列是否为空
bool empty(Queue& q) {
if(q.front == q.rear) return true;
return false;
}
//队列是否为满
bool full(Queue& q) {
if(q.rear+1 == q.front) return true;
return true;
}
// 入队
bool EnQueue(Queue& q, ELEM& e) {
if(full(q)) return false;
q.date[q.rear] = e;
q.rear = (q.rear+1)%MAX_SIZE;
return true;
}
// 出队
bool DeQueue(Queue& q, ELEM& e) {
if(empty(q)) return false;
e = q.date[q.front];
q.front=(q.front+1)%MAX_SIZE;
return true;
}
// 获取长度
int length(Queue& q) {
return (q.rear-q.front+MAX_SIZE)%MAX_SIZE;
}
//获取首元素
void getElem(Queue& q, ELEM& e) {
if(empty(q)) return;
e = q.date[q.front];
}
万变不离其宗,队列不过是受限制的线性表…先进先出是原理,记住这个就可以了