【数据结构 循环队列】循环队列|c语言|顺序结构

今天复习一下数据结构里面的循环队列:

1.循环队列是顺序结构

2.循环队列的总长度是MAXSIZE - 1

3.指针实现

注:循环队列的总长度不是MAXSIZE,是MAXSIZE - 1!!!

计算式:

指针移动:(front + 1)%MAXSIZE

总长度:(rear - front + MAXSIZE)% MAXSIZE


#include <stdio.h>
#include <stdlib.h>

//最大长度 
#define MAXSIZE 3

//循环队列 
typedef struct SqQueue
{
	int* data;
	int front;
	int rear;
}SqQueue;

//初始化队列
SqQueue* InitQueue()
{
	SqQueue* queue = (SqQueue*)malloc(sizeof(SqQueue));
	queue->data = (int*)malloc(MAXSIZE * sizeof(int));
	queue->front = queue->rear = 0;
	
	return queue;
} 

//清空队列
void ClearQueue(SqQueue* queue)
{
	if(queue != NULL)
	{
		queue->front = queue->rear = 0;	
		
		printf("队列已经清空!\n");
	}
	else
	{
		printf("未初始化队列!\n");
	}
} 

//销毁队列
void DestroyQueue(SqQueue* queue)
{
	if(queue != NULL)
	{
		free(queue);
		queue = NULL;
		
		printf("队列已经销毁!\n");
	}
	else
	{
		printf("未初始化队列!\n");
	} 
}

//入队
void InsertQueue(SqQueue* queue, int data)
{
	if((queue->rear + 1) % MAXSIZE != queue->front)
	{
		queue->data[queue->rear] = data;
		queue->rear = (queue->rear + 1) % MAXSIZE;
	}	
	else
	{
		printf("队列已满!\n");
	}
} 

//出队 
void PopQueue(SqQueue* queue)
{
	if(queue->front != queue->rear)
	{
		queue->front = (queue->front + 1) % MAXSIZE;
	}
	else
	{
		printf("队列已空!\n");
	}
}

//队长 
void  QueueLength(SqQueue* queue)
{
	printf("%d\n", (queue->rear - queue->front + MAXSIZE) % MAXSIZE);
}

//队列遍历
void ThroughQueue(SqQueue* queue)
{
	int begin = queue->front;
	int end = queue->rear < queue->front ? queue->rear + MAXSIZE : queue->rear;
	int index;
	
	for (begin;begin < end;begin++)
	{
		index = begin >= MAXSIZE ? begin - MAXSIZE : begin;
		printf("%d\t", queue->data[index]);
	}
	
	printf("\n");
}

int main()
{
	int judge, data;
	SqQueue* queue = NULL;
	
	while(1)
	{
		fflush(stdin);
		
		printf("1.初始化队列\n2.清空队列\n3.销毁队列\n4.入队\n5.出队\n6.遍历\n7.队长\n");
		scanf("%d", &judge);
		
		switch(judge)
		{
			case 1://初始化队列
				queue = InitQueue();
				break;
				
			case 2://清空队列
				ClearQueue(queue);
				break;
				
			case 3://销毁队列
				DestroyQueue(queue);
				break;
				
			case 4://入队
				printf("请输入一个数据:");
				scanf("%d", &data);
				InsertQueue(queue, data);
				break;
				
			case 5://出队
				PopQueue(queue);
				break;
				
			case 6://遍历
				ThroughQueue(queue);
				break;
				
			case 7://队长
				QueueLength(queue);
				break;
				
			default:
				printf("请输入正确的数字!");
		}
	}
	
	return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

活成自己的样子啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值