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

队列——一种操作受限的线性表

队列

队列(Queue)简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队,删除元素称为出队或离队。队列中的元素是先进先出(First In First Out,FIFO)。

队头(Front):允许删除的一端,又称队首。

队尾(Rear):允许插入的一端。

		————————————————————
出队列<---- a1 a2 a3 a4 a5 <-----入队列————————————————————^				^|				|队头			 队尾

循环队列

用数组实现循环队列

#define MAX_SIZE 6
typedef int ElemType;
typedef struct {// 数组 存储MAX_SIZE - 1个元素ElemType data[MAX_SIZE];// 队列头 队列尾int front, rear;
} SqQueue;

请添加图片描述

#include <stdio.h>#define MAX_SIZE 6
typedef int ElemType;
typedef struct {// 数组 存储MAX_SIZE - 1个元素ElemType data[MAX_SIZE];// 队列头 队列尾int front, rear;
} SqQueue;/** 初始化循环队列*/
void init_queue(SqQueue &Q) {// 初始化循环队列: 让头部和尾部都指向零号Q.front = Q.rear = 0;
}/** 判断循环队列是否为空*/
bool queue_empty(SqQueue Q) {return Q.front == Q.rear;
}/** 入队*/
bool enqueue(SqQueue &Q, ElemType data) {// 判断队列是否已满if ((Q.rear + 1) % MAX_SIZE == Q.front) {return false;}// 放入元素Q.data[Q.rear] = data;// rear加1Q.rear = (Q.rear + 1) % MAX_SIZE;return true;
}/** 出队*/
bool dequeue(SqQueue &Q, ElemType &elem) {// 判断队列是否为空if (queue_empty(Q)) {return false;}// 队首元素elem = Q.data[Q.front];// front加1Q.front = (Q.front + 1) % MAX_SIZE;return true;
}int main() {SqQueue Q;// 一、初始化循环队列init_queue(Q);// 二、判断循环队列是否为空bool ret = queue_empty(Q);if (ret) {printf("queue is empty\n");}// 三、入队enqueue(Q, 3);enqueue(Q, 4);ret = enqueue(Q, 5);if (ret) {printf("enqueue success\n");} else {printf("enqueue failed\n");}// 四、出队ElemType elem;ret = dequeue(Q, elem);if (ret) {printf("dequeue succes, elem = %d\n", elem);} else {printf("dequeue failed\n");}enqueue(Q, 6);enqueue(Q, 7);enqueue(Q, 8);ret = enqueue(Q, 9);return 0;
}

队列

队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表。头指针指向队头结点,尾指针指向队尾结点,即单链表的最后一个结点。

链表尾插法实现入队,链表头删法实现出队。

请添加图片描述

#include <stdio.h>
#include <stdlib.h>typedef int ElemType;
typedef struct LinkNode {ElemType data;struct LinkNode *next;
} LinkNode;// 链表 先进先出
typedef struct LinkQueue {// 链表头/队头 链表尾/队尾LinkNode *front, *rear;
} LinkQueue;/** 队列的初始化(带头结点的链表实现)*/
void init_queue(LinkQueue &Q) {// 头和尾指向同一个结点Q.front = Q.rear = (LinkNode *) malloc(sizeof(LinkNode));// 头结点的next指针为NULLQ.front->next = NULL;
}/** 判断队列是否为空*/
bool queue_empty(LinkQueue Q) {if (Q.front == Q.rear) {return true;}return false;
}/** 入队*/
void enqueue(LinkQueue &Q, ElemType data) {LinkNode *new_node = (LinkNode *) malloc(sizeof(LinkNode));new_node->data = data;new_node->next = NULL;// 尾指针的next指向new_nodeQ.rear->next = new_node;// rear指向新的尾部Q.rear = new_node;
}/** 出队*/
bool dequeue(LinkQueue &Q, ElemType &elem) {// 判断队列是否为空if (queue_empty(Q)) {return false;}// 第一个结点LinkNode *q = Q.front->next;elem = q->data;Q.front->next = q->next;// 链表只剩一个结点时 被删除后 要改变rearif (Q.rear == q) {Q.rear = Q.front;}//让第一个结点断链free(q);return true;
}int main() {// 新建队列LinkQueue Q;// 一、初始化队列init_queue(Q);// 二、判断队列是否为空bool ret = queue_empty(Q);if (ret) {printf("queue is empty\n");}// 三、入队enqueue(Q, 3);enqueue(Q, 4);enqueue(Q, 5);// 四、出队ElemType elem;dequeue(Q, elem);dequeue(Q, elem);ret = dequeue(Q, elem);if (ret) {printf("dequeue success element = %d\n", elem);} else {printf("dequeue failed\n");}return 0;
}

相关文章:

  • 【python学习】Anaconda的介绍、下载及conda和pip换源方式(切换到国内镜像源)
  • docker使用docker logs命令查看容器日志的几种方式
  • 出现 Transaction rolled back because it has been marked as rollback-only 解决方法
  • 联邦学习【01】杨强第三章横向联邦学习复现
  • Lombok一文通
  • 杂牌记录仪TS视频流恢复方法
  • PHPstudy情况下上传图片马需要的.htaccess文件
  • MYSQL视图
  • MySQL嵌套,别名,分组查询
  • 安全基础二
  • L9110S电机控制模块
  • 书生·浦语大模型全链路开源体系-笔记作业2
  • 设计模式——结构型模式——责任链模式
  • vue 引用第三方库 Swpier轮播图
  • Low Memory Killer in Android
  • CSS相对定位
  • docker python 配置
  • extract-text-webpack-plugin用法
  • Go 语言编译器的 //go: 详解
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • javascript 哈希表
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • javascript面向对象之创建对象
  • JSONP原理
  • linux学习笔记
  • Lucene解析 - 基本概念
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Yii源码解读-服务定位器(Service Locator)
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 从0实现一个tiny react(三)生命周期
  • 从零开始学习部署
  • 力扣(LeetCode)357
  • 微信小程序开发问题汇总
  • 项目实战-Api的解决方案
  • C# - 为值类型重定义相等性
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • $.proxy和$.extend
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (Python第六天)文件处理
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)ObjectiveC 深浅拷贝学习
  • .NET 4.0中的泛型协变和反变
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net 中viewstate的原理和使用
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • ??myeclipse+tomcat
  • []sim300 GPRS数据收发程序
  • [2]十道算法题【Java实现】
  • [20171106]配置客户端连接注意.txt
  • [2024-06]-[大模型]-[Ollama]- WebUI