首页 > 其他分享 >C实现循环队列

C实现循环队列

时间:2023-11-13 17:45:59浏览次数:27  
标签:queue int 队列 Queue 实现 maxsize 循环 front

1.循环队列的基本模型

1.1 此模型采用的队列判空条件是rear == front为真

1.2 此模型采用的队列已满条件是(rear+1)%maxsize == front为真,因此有一个数组单元(也就是front指向的数组单元)不可使用

1.3 可以在队列结点加一个成员表示最近一次对队列的操作为入队操作或者出队操作,这样就就可以利用数组的全部单元

1.3.1 这种情况下,队列为空的条件:rear == front为真 && 最近一次对队列的操作是出队操作

1.3.1 这种情况下,队列已满的条件:rear == front为真 && 最近一次对队列的操作是入队操作

1.4 本文采用第一种方案(浪费一个数组单元)

2.循环队列的结点结构

typedef struct QueueNode {
	int* data;  /*使用数组存放队列元素*/
	int front, rear;  /*队头指针,队尾指针*/
	int maxsize;  /*队列的最大元素个数*/
} QueueNode, *Queue;

3.创建并初始化一个循环队列,参数maxsize表示队列最大元素个数

Queue createQueue(int maxsize) {
	/*初始化一个循环队列*/
	Queue queue = (Queue)malloc(sizeof(QueueNode));
	queue->data = (int*)malloc(sizeof(int) * maxsize);
	queue->front = 0;
	queue->rear = 0;
	queue->maxsize = maxsize;
	return queue;
}

4.判断循环队列是否为空

bool isEmpty(Queue queue) {
	/*判断队列是否为空*/
	return queue->rear == queue->front;
}

5.判断循环队列是否已满

bool isFull(Queue queue) {
	/*判断队列是否已满*/
	return (queue->rear + 1) % queue->maxsize == queue->front;
}

6.元素在队尾入队:首先rear = (rear+1)%maxsize,然后再赋值

bool enqueue(Queue queue, int element) {
	/*在队列的尾部入队,需要判断队列是否已满*/
	if (isFull(queue)) {
		printf("queue is full!!\n");
		return false;
	} else {
		queue->rear = (queue->rear + 1) % queue->maxsize;
		(queue->data)[queue->rear] = element;
		return true;
	}
}

7.队头元素出队:首先front = (front+1)%maxsize,然后再出队

int dequeue(Queue queue) {
	/*队头元素出队,需要判断队列是否为空*/
	if (isEmpty(queue))	{
		printf("queue is empty!!!\n");
		return 99999;
	} else {
		queue->front = (queue->front + 1) % queue->maxsize;
		return (queue->data)[queue->front];
	}
}

8.销毁队列

void destroy(Queue queue) {
	/*销毁队列*/
	free(queue->data);
	queue->data = NULL;
	free(queue);
	queue = NULL;
}

9.完整代码

点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct QueueNode {
	int* data;  /*使用数组存放队列元素*/
	int front, rear;  /*队头指针,队尾指针*/
	int maxsize;  /*队列的最大元素个数*/
} QueueNode, *Queue;

Queue createQueue(int maxsize);
bool isEmpty(Queue queue);
bool isFull(Queue queue);
bool enqueue(Queue queue, int element);
int dequeue(Queue queue);
void destroy(Queue queue); 

int main(int argc, char* argv[]) {
	/*创建循环队列*/
	int maxsize;
	printf("Please input maxsize: ");
	scanf("%d", &maxsize);
	Queue queue = createQueue(maxsize);

	/*执行入队出队操作*/
	enqueue(queue, 10);
	enqueue(queue, 20);
	printf("%d\n", dequeue(queue));
	enqueue(queue, 5);
	printf("%d\n", dequeue(queue));

	/*销毁队列*/
	destroy(queue);
	queue = NULL;

	return 0; 
}

Queue createQueue(int maxsize) {
	/*初始化一个循环队列*/
	Queue queue = (Queue)malloc(sizeof(QueueNode));
	queue->data = (int*)malloc(sizeof(int) * maxsize);
	queue->front = 0;
	queue->rear = 0;
	queue->maxsize = maxsize;
	return queue;
}

bool isEmpty(Queue queue) {
	/*判断队列是否为空*/
	return queue->rear == queue->front;
}

bool isFull(Queue queue) {
	/*判断队列是否已满*/
	return (queue->rear + 1) % queue->maxsize == queue->front;
}

bool enqueue(Queue queue, int element) {
	/*在队列的尾部入队,需要判断队列是否已满*/
	if (isFull(queue)) {
		printf("queue is full!!\n");
		return false;
	} else {
		queue->rear = (queue->rear + 1) % queue->maxsize;
		(queue->data)[queue->rear] = element;
		return true;
	}
}

int dequeue(Queue queue) {
	/*对头元素出队,需要判断队列是否为空*/
	if (isEmpty(queue))	{
		printf("queue is empty!!!\n");
		return 99999;
	} else {
		queue->front = (queue->front + 1) % queue->maxsize;
		return (queue->data)[queue->front];
	}
}

void destroy(Queue queue) {
	/*销毁队列*/
	free(queue->data);
	queue->data = NULL;
	free(queue);
	queue = NULL;
}

10.点击pythontutor进入线上运行环境

标签:queue,int,队列,Queue,实现,maxsize,循环,front
From: https://www.cnblogs.com/gjsun/p/17829715.html

相关文章

  • 单调队列
    acwing154滑动窗口,单调队列q存的是下标,真正的值需要再套一个a数组1#include<iostream>2usingnamespacestd;34constintN=1e6+10;56intn,k;7inta[N],q[N];//q代表单调队列89intmain()10{11scanf("%d%d",&n,&k);12for(in......
  • 开发企业微信群机器人,实现定时提醒
    大家好,我是鱼皮,今天分享一个用程序解决生活工作问题的真实案例。说来惭愧,事情是这样的,在我们公司,每天都要轮流安排一名员工(当然也包括我)去楼层中间一个很牛的饮水机那里接水。但由于大家每天都有自己的工作,经常出现忘记接水的情况,导致大家口渴难耐。怎么解决这个问题呢?我想到了几种......
  • 实现冒泡排序算法
    实现冒泡排序算法#include<stdio.h> voidswap(int*xp,int*yp){   inttemp=*xp;   *xp=*yp;   *yp=temp;} voidbubbleSort(intarr[],intn){   for(inti=0;i<n-1;i++){       for(intj=0;j<n-i-1;j++){       ......
  • Python 如何实现合并 PDF 文件?
    在处理多个PDF文档时,频繁地打开关闭文件会严重影响效率。因此,对于一大堆内容相关的PDF文件,我们可以先将这些PDF文件合并起来再操作,从而提高工作效率。比如,在传送大量的PDF文档时,在处理同一项目下的多个PDF文档时,或在打印一系列PDF文档时,将文档合并起来可以减少工作量......
  • 如何用Angular or Vue 来 实现Dynamics 365 WebResource 开发
    第一步:构建Angular项目,可以使用VisualStudio的项目模版创建(含.netCore相关)或者使用Angularcli创建,我习惯使用angularcli 执行以下命令:ngnew项目名称,回车可以选择含路由,style是CSSorLESS根据所需选取,稍等几分钟(取决于网络,会download......
  • VPC终端节点的实现架构和原理
    本文分享自天翼云开发者社区《VPC终端节点的实现架构和原理》,作者:云云生息什么是VPC终端节点?在传统的VPC架构中,为了使VPC内的资源能够与云服务提供商的各种服务进行通信,通常需要通过公共Internet进行访问。这种方式存在一些问题,比如安全性、可靠性、访问速度等。为了解决这些问......
  • 使用Java实现NIO
    以下是一个使用JavaNIO实现Reactor模型的简单示例代码,并附有详细的注释: importjava.io.IOException;importjava.net.InetSocketAddress;importjava.nio.ByteBuffer;importjava.nio.channels.SelectionKey;importjava.nio.channels.Selector;importjava.nio.ch......
  • 循环结构
    循环结构分为两类一类是比遍历循环结构for,一类是无限循环结构while 遍历循环for语句结构:for循环变量in遍历对象fir....else...结构:for循环变量in遍历对象  语句块1else:  语句块2 示例#计算1-10.之间的累加和s=0#用于存储......
  • ubuntu arm64 配置静态IP 并实现VNC远程树梅派
    1.设置静态IP完成后ifconfig查看IPpingIP地址测试 ping192.168.10.1592.VNC远程树梅派树梅派VNC是server端,VNC版本是:RealVNC客户端:archubuntu18 一开始用gvncviewer连接,出现秒断开的问题,如下:$gvncviewer192.168.149.1ConnectedtoserverDisconnectedfromser......
  • 饮水机如何实现低液位检测
    随着科技的不断发展,传感器在我们的日常生活和工作中发挥着越来越重要的作用。其中,光电液位传感器在饮水机中的应用,使得饮水机能够实现低液位检测,从而为用户提供更为便捷和智能的服务。光电液位传感器是一种非接触式传感器,它利用光线的反射原理来检测液位。当传感器发射一束光线时,如......