【C】【Queue】循环队列的实现

循环队列的实现

//循环队列的实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define MAXSIZE 5
#define SIZE (MAXSIZE - 1)
//数组的下标为0~(M-1)
//队列也只有M-1项

typedef struct data {
	int n;
}Data;

typedef struct {
	Data data[MAXSIZE];//结构体数组
	int front;//队头
	int rear;//队尾
}Queue;

bool InitQueue(Queue* pq);//初始化队列
bool QueueIsEmpty(Queue* pq);//判断队列是否为空
bool QueueIsFull(Queue* pq);//判断队列是否已满
bool InQueue(Queue* pq, Data data);//入队
bool OutQueue(Queue* pq);//出队
void ShowQueue(Queue* pq);//展示队列

bool InitQueue(Queue* pq)
{
	pq->front = pq->rear = 0;

	if (pq->front == 0 && pq->rear == 0)
		return true;
	else return false;
}

bool QueueIsEmpty(Queue* pq)
{
	if (pq->front == pq->rear)
	{
		printf("队列为空!\n");
		return true;
	}
	else return false;
}

bool QueueIsFull(Queue* pq)
{
	//因为是循环队列,会出现rear < front的情况
	//而一般出现这种情况,是已经入队过多于SIZE的项目,所以其实rear的真实值本为:rear + MAXSIZE
	//但这会导致SIZE > MAXSIZE,因此要进行求模操作
	//之后的求模操作也是大致因为这个原因,以入队为例,请看入队操作注释
	if (SIZE == (pq->rear + MAXSIZE - pq->front) % MAXSIZE)
	{
		printf("队列已满!\n");
		return true;
	}
	else return false;
}

bool InQueue(Queue* pq, Data data)
{
	if (QueueIsFull(pq) == true)
		return false;
	else
	{
		//假设MAXSIZE = 5,则数组下标为0~4,而队列真正队长为SIZE = MAXSIZE - 1
		//如果你进行了4次入队操作,此时rear = 4,front = 0,已经队满
		//然后进行1次出队操作,此时rear = 4, front = 1,队列空出一个位置
		//再进行1次入队操作,此时如果直接进行 rear++,(rear = 5),会导致数组下标越界
		//必须进行求模运算,使rear重新变为0
		//这体现了循环队列的  “循环”
		pq->rear = (pq->rear + 1) % MAXSIZE;
		pq->data[pq->rear] = data;//结构体赋值
		return true;
	}
}

bool OutQueue(Queue* pq)
{
	if (QueueIsEmpty(pq) == true)
		return false;
	else
	{
		pq->front = (pq->front + 1) % MAXSIZE;
		printf("出队成功!\n");
		return true;
	}
}

void ShowQueue(Queue* pq)
{
	int size = (pq->rear + MAXSIZE - pq->front) % MAXSIZE;
	int i = 1;
	if (QueueIsEmpty(pq) == false)
	{
		for (i; i <= size; i++)
			printf("%d ", pq->data[(pq->front + i) % MAXSIZE].n);
	}
}

int main()
{
	Queue Q;
	Data temp = {0};

	if (InitQueue(&Q) == true)
	{
		printf("程序运行……\n");
		system("pause");
		system("cls");
		printf("本队列长:%d\n", SIZE);
	}
	else
		exit(1);

	for (int i = 0; i < SIZE; i++)
	{
		scanf("%d", &temp.n);
		while (getchar() != '\n')
			continue;
		InQueue(&Q, temp);
	}

	OutQueue(&Q);

	ShowQueue(&Q);

	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值