循环队列与普通队列的区别:普通队列入队出队后,出队后的空间无法使用,如果入队出队的次数多了,可能会造成"假溢出"。
但是循环列表不会,它可以只用以前出队的空间,从而形成逻辑上的闭环。
初始化:
int init(Queue* q) {
//初始化队列
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
q->front = 0;
q->rear = 0;
return 1;
}
是否为满:
因为是循环队列,所以队首和队尾不能相同,否则就不知道是一个元素还是满元素,所以没有循环列表中相等为空,所以当队尾+1 == 队首的时候,就可知空间满了
int ISfull(Queue* q) {
//判断是否满了
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if ((q->rear+1)%MAX_SIZE == q->front) {
return 1;
}
else {
return 0;
}
}
是否为空:
int ISempty(Queue* q) {
//判断是否为空
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (q->front == q->rear) {
return 1;
}
else {
return 0;
}
}
入队:
先判断是否为满,再将数据放置到队尾,队尾+1,因为是循环队列,所以队尾可能会占用以前的空间,所以只要队列不满,就可以用%来将队尾指针指向前面用过的空间。
int EnterQueue(Queue* q, int date) {
//插入元素
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (ISfull(q)) {
cout << "队列已满 ,无法入队" << endl;
}
q->queue[q->rear] = date;
q->rear=(q->rear+1)%MAX_SIZE;
return 1;
}
出队:与入队一个道理
int deQueue(Queue* q, int& date) {
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (ISempty(q)) {
cout << "队列为空,无法删除" << endl;
return 0;
}
date = q->front;
q->front = (q->front+1)%MAX_SIZE;
return 1;
}
打印:
int print(Queue* q) {
//打印元素
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (ISempty(q)) {
cout << "队列为空,无法打印" << endl;
}
int i = q->front;
while (i != q->rear) {
cout << setw(4) << q->queue[i];
i = (i + 1) % MAX_SIZE;
}
return 1;
}
全部代码:
#include<iostream>
#include<stdio.h>
#include<assert.h>
#include<iomanip>
#include<Windows.h>
using namespace std;
#define MAX_SIZE 5
typedef struct Queue {
int queue[MAX_SIZE];
int front;
int rear;
}Queue;
int init(Queue* q);//初始化
int ISfull(Queue* q);//是否满了
int ISempty(Queue* q);//是否为空
int EnterQueue(Queue* q, int date); //队尾插入元素
int print(Queue* q);//打印元素
int deQueue(Queue* q, int& date);//删除元素
int GetHead(Queue* q, int date);
int ClearQueue(Queue* q);
int main() {
Queue* q = new Queue;
int date = -1;
init(q);
for (int i = 0;i < 7;i++) {
EnterQueue(q,i);
}
print(q);
for (int i = 0;i < 5;i++) {
deQueue(q, date);
}
print(q);
for (int i = 0;i < 4;i++) {
EnterQueue(q, i);
}
print(q);
system("pause");
return 0;
}
int init(Queue* q) {
//初始化队列
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
q->front = 0;
q->rear = 0;
return 1;
}
int ISfull(Queue* q) {
//判断是否满了
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if ((q->rear+1)%MAX_SIZE == q->front) {
return 1;
}
else {
return 0;
}
}
int ISempty(Queue* q) {
//判断是否为空
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (q->front == q->rear) {
return 1;
}
else {
return 0;
}
}
int EnterQueue(Queue* q, int date) {
//插入元素
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (ISfull(q)) {
cout << "队列已满 ,无法入队" << endl;
}
q->queue[q->rear] = date;
q->rear=(q->rear+1)%MAX_SIZE;
return 1;
}
int print(Queue* q) {
//打印元素
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (ISempty(q)) {
cout << "队列为空,无法打印" << endl;
}
int i = q->front;
while (i != q->rear) {
cout << setw(4) << q->queue[i];
i = (i + 1) % MAX_SIZE;
}
return 1;
}
int deQueue(Queue* q, int& date) {
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (ISempty(q)) {
cout << "队列为空,无法删除" << endl;
return 0;
}
date = q->front;
q->front = (q->front+1)%MAX_SIZE;
return 1;
}
int GetHead(Queue* q, int date) {
if (!q || ISempty(q)) {
cout << "队列为空!" << endl;
}
return date = q->queue[q->front];
}
int ClearQueue(Queue* q) {
if (!q) return 0 ;
q->front = q->rear = 0;
return 0;
}