顺序队列的实现(循环队列)

简单队列

在顺序队列中,通常让队尾指针rear指向刚进队的元素的位置,让队首指针front指向刚出队的元素的位置。因此,元素进队的时候rear指针要向后移动,元素出队的时候front指针也要向后移动。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define MAXSIZE 20

typedef int ElemType;     // 定义类型
typedef struct QNode
{
	ElemType data[MAXSIZE];
	int Front;
	int Rear;
} Queue;

void InitQueue(Queue *Q)      // 初始化队列
{
	Q->Front = 0;
	Q->Rear = 0;
	printf("队列初始化成功\n");
}

void ClearQueue(Queue *Q)     // 清空队列
{
	Q->Front = 0;
	Q->Rear = 0;
	printf("队列已经置空\n");
}

int EmptyQueue(Queue Q)     // 判断队列是否为空
{
	if (Q.Front == Q.Rear)
	{
		printf("队列是空的\n");
		return 1;
	}
	else
	{
		printf("队列非空\n");
		return 0;
	}
}

int LengthQueue(Queue Q)    // 求队列的长度
{
	return (Q.Rear - Q.Front + MAXSIZE) % MAXSIZE;
}

void AddQueue(Queue *Q, ElemType e)   // 入队操作
{
	if ((Q->Rear + 1) % MAXSIZE == Q->Front)    // 判断队列是否满
	{
		printf("队列是满的!!!\n");
	}
	Q->data[Q->Rear] = e;  // 元素入队
	Q->Rear = (Q->Rear + 1) % MAXSIZE;   // 队尾向后移
} 

void DeleteQueue(Queue *Q)    // 出队操作
{
	int t;
	if (Q->Front == Q->Rear)   // 判断队列是否为空
	{
		printf("队列是空的!!!\n");
	}
	t = Q->data[Q->Front];    // 元素出队
	Q->Front = (Q->Front + 1) % MAXSIZE;    //  队头后移
	printf("删除元素%d\n", t);
}

void QueueTraverse(Queue Q)    // 遍历队列
{
	if (EmptyQueue(Q))
		return;
	int i = Q.Front;
	while ((i + Q.Front) != Q.Rear)
	{
		printf("%d ", Q.data[i]);
		i = (i + 1) % MAXSIZE;
	}
	printf("\n");
}

int main()
{
	Queue Q;
	InitQueue(&Q);    // 队列初始化
	EmptyQueue(Q);              // 队列置空
	int e;
	int n;
	printf("请输入你想要的添加几个元素:");
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		AddQueue(&Q, i);
	}
	printf("入队成功!!!");
	int Len = LengthQueue(Q);
	printf("队列的长度是%d\n", Len);
	printf("队列的遍历为:");
	QueueTraverse(Q);
	printf("\n");
	printf("现在开始出队!!!\n");
	for (int i = 1; i <= n; i++)
	{
		DeleteQueue(&Q);
	}
	Len = LengthQueue(Q);
	printf("此时队列的长度是%d\n", Len);
	printf("再次添加元素\n");
	for (int i = 1; i <= n; i++) //为了验证ClearQueue,再次添加
	{
		AddQueue(&Q, i);
	}
	Len = LengthQueue(Q);
	printf("队列的长度是%d\n", Len);
	ClearQueue(&Q);    // 清空队列
	Len = LengthQueue(Q);
	printf("此时队列长度是%d\n", Len);
	EmptyQueue(Q);
	getchar();
	getchar();
	return 0;
}

在这里插入图片描述

循环队列

两个指针最终会到达数组的末端处,虽然队中已没有了元素,但是仍然无法插入元素,这就是所谓的“假溢出”。为了解决假溢出的问题,可以将数组弄成一个环状,让rear和front指针沿着环走,这样就不会出现无法继续走下去的情况,这样就产生了循环队列

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 20

//定义队列的结构体 
typedef struct Squeue {
	int data[Maxsize];
	int front;
	int rear;
}Squeue;

//初始化队列 
void InitQueue(Squeue &qu)
{
	qu.front = qu.rear = 0;
}

//判断队列是否为空 
int isQueueEmpty(Squeue qu)
{
	if (qu.front == qu.rear)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

//元素入队操作 
int inQueue(Squeue &qu, int x)
{
	//若队满则无法入队 
	if ((qu.rear + 1) % Maxsize == qu.front)
	{
		return 0;
	}
	qu.rear = (qu.rear + 1) % Maxsize;
	qu.data[qu.rear] = x;
	return 1;
}

//元素出队操作 
int deQueue(Squeue &qu, int &x)
{
	//若队空则无法出队 
	if (qu.front == qu.rear)
	{
		return 0;
	}
	qu.front = (qu.front + 1) % Maxsize;
	x = qu.data[qu.front];
	return 1;
}

int main()
{
	Squeue q;
	int i, n, x, a;
	InitQueue(q);
	printf("请输入元素个数:");
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		scanf("%d", &a);
		inQueue(q, a);
	}
	//当队列非空时,输出队列中所有数据 
	while (!isQueueEmpty(q))
	{
		deQueue(q, x);
		printf("%d ", x);
	}
	getchar();
	getchar();
	return 0;
}

在这里插入图片描述

发布了60 篇原创文章 · 获赞 6 · 访问量 7769

猜你喜欢

转载自blog.csdn.net/qq_44205272/article/details/103336179