当前位置: 首页 > article >正文

C语言数据结构学习:循环队列

C语言 数据结构学习 汇总入口:

C语言数据结构学习:[汇总]

1. 循环队列

  1. 队列的博客:C语言数据结构学习:队列
  • 循环队列会预先定义最大队列空间,然后定义一个数组,通过队列头和队列尾指针分别指向开头和结尾,添加节点时队列尾自动后移。

  • 但是直接使用的话,会出现虚假满状态问题,也就是当队列尾循环一圈后,重新指向了队列头,导致无法判别队列是否为空或满

  • 可通过另设标志位或少用一个元素空间这两种方法解决此处采用少用一个元素空间的方法。

    • 也就是当队列尾的下一个元素为队列头时,表示队列已满

2. 循环队列的特点

  1. 会出现虚假满状态问题,也就是当队列尾循环一圈后,重新指向了队列头,导致无法判别队列是否为空或满。可通过另设标志位或少用一个元素空间这两种方法解决此处采用少用一个元素空间的方法。
  2. 基本操作
    • 初始化队列
    • 出队
    • 入队

3. 代码示例

  1. 定义新的类型:Node,用于创建队列
  2. #define MAXSIZE 5

#define MAXSIZE 5
/* 节点 */
typedef struct Queue {
	int front;	//定义队头指针
	int rear;	//定义队尾指针
	int data[MAXSIZE];
}Queue;
  1. 初始化队列

    /* 初始化队列 */
    Queue* InitQueue() {
    	Queue* Q = (Queue*)malloc(sizeof(Queue));
    	Q->front = 0;
    	Q->rear = 0;
    	return Q;
    }
    
  2. 入队,出队

    /* 检查队列是否为满 */
    Queue* isFULL(Queue* Q) {
    	if ((Q->rear + 1) % MAXSIZE == Q->front) {
    		return 1;
    	}
    	else{
    		return 0;
    	}
    }
    /* 入队 */
    int enQueue(Queue* Q, int data) {
    	if (isFULL(Q)) {
    		return -1;
    	}
    	else {
    		Q->data[Q->rear] = data;	//存进去
    		Q->rear = (Q->rear + 1) % MAXSIZE;	//++,循环的哈~
    		return 1;
    	}
    
    }
    
    /* 检查队列是否为空 */
    Queue* isEmpty(Queue* Q) {
    	if (Q->front == Q->rear) {
    		return 1;
    	}
    	else {
    		return 0;
    	}
    }
    /* 出队 */
    int deQueue(Queue* Q) {
    	if (isEmpty(Q)) {
    		return -1;
    	}
    	else{
    		int data = Q->data[Q->front];	//取出来
    		Q->front = (Q->front + 1) % MAXSIZE;	//++,循环的哈~
    		return data;
    	}
    }
    
  3. 打印队列

    /* 打印队列 */
    void PrintQueue(Queue* Q) {
    	//判断队列中有多少个元素
    	int len = (Q->rear - Q->front + MAXSIZE) % MAXSIZE;
    	int temp = Q->front;
    	for (int i = 0; i < len; i++){
    		printf("%d ", Q->data[temp]);
    		temp = (temp + 1) % MAXSIZE;
    	}
    	printf("NULL\\r\\n");
    }
    
  4. 测试

    int main(void)
    {
    	Queue* Q = InitQueue();
    	enQueue(Q, 1);
    	enQueue(Q, 2);
    	enQueue(Q, 3);
    	enQueue(Q, 4);
    	PrintQueue(Q);
    	deQueue(Q);
    	deQueue(Q);
    	PrintQueue(Q);
    	return 0;
    }
    


http://www.kler.cn/a/410958.html

相关文章:

  • 3174、清除数字
  • 工作问题总结4
  • 【FPGA】Verilog:利用 4 个串行输入- 串行输出的 D 触发器实现 Shift_register
  • 单点修改,区间求和或区间询问最值(线段树)
  • Move 合约部署踩坑笔记:如何解决 Sui 客户端发布错误Committing lock file
  • python中一些内置的数据类型转换方
  • GreatSQL 运行时内存太高,超过90%怎么办
  • 带有悬浮窗功能的Android应用
  • 极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【三】
  • 第 35 章 - Go语言 容器化应用
  • 分布式查询处理优化之数据分片
  • 医院信息化与智能化系统(22)
  • 微信小程序 WXS 的概念与基本用法教程
  • 101页PDF | 德勤_XX集团信息化顶层规划设计信息化总体解决方案(限免下载)
  • uniapp-vue2引用了vue-inset-loader插件编译小程序报错
  • 【网络安全】
  • 【从零开始的LeetCode-算法】43. 网络延迟时间
  • Spring Boot 3 集成 Spring Security(2)
  • 15 go语言(golang) - 并发编程goroutine原理及数据安全
  • Linux -日志 | 线程池 | 线程安全 | 死锁
  • 自由学习记录(25)
  • 充满智慧的埃塞俄比亚狼
  • 图像分割——区域增长
  • AIGC--AIGC与人机协作:新的创作模式
  • ffmpeg RTP PS推流
  • ESC字符背后的故事(27 <> 033 | x1B ?)