数据结构---循环队列

循环队列与普通队列的区别:普通队列入队出队后,出队后的空间无法使用,如果入队出队的次数多了,可能会造成"假溢出"。
但是循环列表不会,它可以只用以前出队的空间,从而形成逻辑上的闭环。
在这里插入图片描述

初始化:

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_49324123/article/details/114312843