linux学习:队列

目录

顺序队列

管理结构体设计

初始化

入队

出队

链式队列

例子  用户输入整数则入队,字母则出队


我们对队列里的元素操作是有严格限制的:插入一个新节点,必须插入到 指定的一端,而删除一个已有节点,则必须在另一端进行。当我们对一个线性表严格地执行 这样的限制的话,这种线性表就是一种特殊的线性表,称之为队列。为了方便描述,将队列 的插入称为入队,删除称为出队。可以插入节点的那一端称之为队尾,另一端则称之为队头

队列这种逻辑结构同样可以使用顺序存储或者使用链式存储,使用顺序存储时,由于出 队入队分别在两端进行,为了避免数据的成片移动造成效率损失,可以考虑使用两个分别指 示队头和队尾的偏移量,来辅助队列操作。而对于链式存储来说,也可以使用类似的组织方 式,用队头和队尾指针来分别指向相应的节点

顺序队列

采用一片连续的内存来存放队列元素,使用两个分别代表队头和队尾距离队列基地址的偏移量来控制队 列,另外可以再加上队列当前元素个数等信息

管理结构体设计

typedef int datatype;typedef struct // 队列管理结构体
{datatype *queue; // 队列指针unsigned int size; // 队列空间大小int front; // 队头元素偏移量int rear; // 队尾元素偏移量
}sequent_queue

初始化

typedef int datatype;
sequent_queue *init_queue(unsigned int size) // 初始化一个空队列
{// 申请一块管理结构体内存sequent_queue *q = malloc(sizeof(sequent_queue));if(q != NULL){q->queue = calloc(size, sizeof(datatype)); // 申请队列内存q->size = size;q->front = 0;q->rear = 0;}return q;
}

init_queue( )所得到的空队列

注意:初始化一个空的顺序队列时,我们只需要使得队头和队尾偏移量相等即可,不一 定非要等于 0,后期在判断队列是否为空的时候,判断的依据就是 front 是否等于 rear, 至于他们究竟指示了顺序队列中的哪个地方是无所谓的,因为我们即将看到,我们会循环第 利用这个顺序存储的空间。

入队

现在有一个元素要入队,那么我们就让其排在原队列的队 尾处(不能插队,这才合理),于是我们让 rear 往后增加一个偏移量,让数据 A 入队,紧 接着让数据 B、数据 C 等等依次入队,rear 不断向后偏移

此时虽然顺序队列中还有一个位置是空着的(front 所指示的位置),但是这个 位置目前不能使用,因为如果将数据再填入这个地方,那么 front 和 rear 又再一次相等, 而这两者相等恰恰是判断队列是否为空的标志,事实上此时队列已经满了

bool en_queue(sequent_queue *q, datatype data)
{if(queue_full(q))return false;q->rear = (q->rear+1) % q->size; // 结果要对 size 求余q->queue[q->rear] = data;return true;
}

出队

我们要“循环”地利用顺序队列的空间,因此在 A 和 B 出队之后, F 和 G 理应可以重复利用他们的空间,这就要求在给 rear 增量的同时必须保证 rear 的范 围要落在 size 之内

bool de_queue(sequent_queue *q, datatype *pdata)
{if(queue_empty(q))return false;q->front = (q->front+1) % q->size; // 结果要对 size 求余*pdata = q->queue[q->front];return true;
}

判断队满不满,空不空

bool queue_full(sequent_queue *q) // 判断队列是否已满
{return q->front == (q->rear+1) % q->size;
}bool queue_empty(sequent_queue *q) 
{return q->front == q->rear;
}

链式队列

入队操作时需要着重注意的是:第一个入队的元素要 额外处理,因为一开始 front 和 rear 都是 NULL,不能进行任何的接引用。出队操作需要 注意的是:如果出队的元素是队列中的唯一的元素,那么队头和队尾指针都必须置空

例子  用户输入整数则入队,字母则出队

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdbool.h>
4
5 typedef int datatype;
6
7 struct node // 队列节点
8 {
9     datatype data;
10     struct node *next;
11 };
12
13 typedef struct // 管理结构体
14 {
15     struct node *front;
16     struct node *rear;
17     unsigned int size;
18 }linked_queue;
19
20 linked_queue *init_queue(void) // 初始化一个空队列
21 {
22     linked_queue *q = malloc(sizeof(linked_queue));
23     if(q != NULL)
24     {
25         q->front = q->rear = NULL;
26         q->size = 0;
27     }
28     return q;
29 }
30
31 struct node *new_node(datatype data) // 创建一个新节点
32 {
33     struct node *new = malloc(sizeof(struct node));
34     if(new != NULL)
35     {
36         new->data = data;
37         new->next = NULL;
38     }
39     return new;
40 }
41
42 bool queue_empty(linked_queue *q) // 判断队列是否为空
43 {
44     return q->size == 0;
45 }
46
47 bool en_queue(linked_queue *q, struct node *new) // 入队
48 {
49     if(new == NULL)
50         return false;
51
52     if(queue_empty(q)) // 如果是第一个节点,要额外处理
53     {
54         q->front = q->rear = new;
55     }
56     else
57     {
58         q->rear->next = new;
59         q->rear = new;
60     }
61
62     q->size++; // size 记录了当前队列的元素个数,入队需加 1
63     return true;
64 }
65
66 bool singular(linked_queue *q) // 判断队列是否刚好只剩一个元素
67 {
68     return (!queue_empty(q)) && (q->front == q->rear);
69 }
70
71 bool de_queue(linked_queue *q, struct node **p) // 出队
72 {
73     if(queue_empty(q)) // 如果队列为空,则立即出错返回
74         return false;
75
76     struct node *tmp = q->front;
77
78     if(singular(q)) // 如果队列只剩一个节点,则出队之后队列被置空
79     {
80         q->front = q->rear = NULL;
81     }
82     else
83     {
84         q->front = q->front->next;
85     }
86
87     if(p != NULL) // p 如果不为 NULL 则使 *p 指向原队头元素
88     {
89         tmp->next = NULL;
90         *p = tmp;
91     }
92     else // p 如果为 NULL 则直接释放原队头元素
93     {
94         free(tmp);
95     }
96     q->size--;
97
98     return true;
99 }
100
101 void show(linked_queue *q) // 显示队列元素
102 {
103     if(queue_empty(q))
104         return;
105
106     struct node *tmp = q->front;
107
108     while(tmp != NULL)
109     {
110         printf("%d\t", tmp->data);
111         tmp = tmp->next;
112     }
113     printf("\n");
114 }
115
116 int main(void)
117 {
118     linked_queue *q;
119     q = init_queue(); // 初始化一个空队列
120
121     int n, ret;
122     while(1)
123     {
124         ret = scanf("%d", &n); // 接收用户输入
125
126         if(ret == 1) // 如果输入的是整数,则将该整数入队
127         {
128             struct node *new = new_node(n);
129             en_queue(q, new);
130             show(q);
131         }
132         else if(ret == 0) // 如果输入非整数,则将队头元素出队
133         {
134             struct node *tmp;
135             de_queue(q, &tmp);
136             show(q);
137             while(getchar() != '\n');
138         }
139     }
140
141     return 0;
142 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/808883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos7 k8s 集群 - Mysql主从架构

项目地址 MysqlCluster configMap mysql-configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: mysqllabels:app: mysql data:primary.cnf: |# 主节点MySQL的配置文件[mysqld]# 使用二进制日志文件的方式进行主从复制&#xff0c;这是一个标准的设置log-binrepli…

掌握 C# 爬虫技术:使用 HttpClient 获取今日头条内容

摘要/导言&#xff1a; 在本文中&#xff0c;我们将探讨如何使用 C# 中的 HttpClient 类和爬虫代理IP技术来获取今日头条的内容。我们还将实现多线程技术&#xff0c;以提高数据采集的效率。 背景/引言&#xff1a; 随着信息时代的到来&#xff0c;数据已经成为了一种非常宝…

Spring Boot 3登录开发进阶:图形验证码接口的实现

内容简介 上文我们已经整合好了jwt,本文我们开始实现图形验证码接口的实现。 前置条件 本文衔接上文&#xff0c;请从上文开始 spring boot3登录开发(整合jwt)_springboot3 jwt-CSDN博客 图形验证码接口实现 1、导入工具依赖 pom.xml: <dependency> <groupId&g…

开发日志2024-04-11

开发日志2024/04/11 1、会员/普通用户预约完成后&#xff0c;技师对应的积分添加预约完成的项目价格添加到统计表的业绩字段中&#xff0c;同时对应的服务次数字段1 实现代码&#xff1a; 前端 shHandler(){this.$confirm(确定操作?, "提示", {confirmButtonText…

HarmonyOS实战开发-拼图、如何实现获取图片,以及图片裁剪分割的功能。

介绍 该示例通过ohos.multimedia.image和ohos.multimedia.mediaLibrary接口实现获取图片&#xff0c;以及图片裁剪分割的功能。 效果预览 使用说明&#xff1a; 使用预置相机拍照后启动应用&#xff0c;应用首页会读取设备内的图片文件并展示获取到的第一个图片&#xff0c;…

go的option模式

go的option模式 1.函数option 把option定义为函数。 package mainimport "fmt"// ServerConfig 定义服务器配置 type ServerConfig struct {Port intTimeout int }// Option 定义函数选项类型 type Option func(*ServerConfig)// WithPort 设置服务器端口 // 这…

word中插入mathtype版的符号后,行间距变大解决方法

问题 解决方法 选中该段&#xff0c;设置固定值行距。如果是宋体&#xff0c;小四&#xff0c;1.25行距&#xff0c;那么固定值就为20磅。 成功解决。

ELK 企业级日志分析 ELFK

一 ELK 简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源 工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 1 ElasticSearch&#xff1a; 是基于Lucene&#xff08;一个全文检索引擎的…

微服务支持平台--限流算法

微服务支持平台–限流 限流算法 限流算法&#xff1a; 算法含义备注令牌桶以恒定速度往一个桶内增加令牌&#xff0c;当桶内令牌满了后&#xff0c;就停止增加令牌适用于流量比较平稳的情况&#xff0c;只能承受小的突发流量滑动窗口将时间周期分为N个小周期&#xff0c;分别记…

Java后端基础知识(String类型)

String类的创建方式 String的特点 1.引用数据类型 2.是final类&#xff0c;一旦创建内容不可修改 3.String类对象相等的判断用equals&#xff08;&#xff09;方法完成&#xff0c;是判断地址数值 String的创建方式 1.直接创建 String str"hello";注意&#xff…

Android进程类型及优先级(前台进程/可见进程/服务进程/缓存进程/空进程)

Android进程类型及优先级 一、Android 进程优先级 Android 进程优先级 :前台进程 > 可见进程 >服务进程 >缓存进程 > 空进程 ; 关键优先级进程 : 活动进程 ;高优先级进程 : 可见进程 , 服务进程 ;低优先级进程 : 后台进程 , 空进程 ; Android 系统中会尽量保证…

09 Php学习:数组和排序

数组概念 在PHP中&#xff0c;数组是一种复合数据类型&#xff0c;用于存储多个值。以下是关于PHP数组的详细解释&#xff1a; 索引数组&#xff1a;索引数组是最基本的数组类型&#xff0c;其中每个元素都有一个唯一的数字索引&#xff0c;从0开始递增。 关联数组&#xff…

Android Studio开发学习(七)———RelativeLayout(相对布局)

在上期中我们对LinearLayout进行了详细的解析&#xff0c;LinearLayout也是我们用的比较多的一个布局,更多的时候更钟情于它的 weight(权重) 属性&#xff0c;等比例划分&#xff0c;对屏幕适配还是 帮助蛮大的;但是使用LinearLayout的时候也有一个问题&#xff0c;就是当界面比…

【蓝桥杯每日一题】4.11 更小的数(不用区间DP)

题目来源&#xff1a; 蓝桥杯 2023 省 A]更小的数 - 洛谷 这题只需要用到双指针就OK~ 思路1&#xff1a; 翻转数组的子数组&#xff0c;然后进行比较大小将翻转后的数组存储在字符串 k k k中&#xff0c;然后将字符串 k k k与字符串 a a a进行逐一元素比较&#xff08;因为…

橘子学JDK之JMH-02(BenchmarkModes)

一、案例二代码 这次我们来搞一下官网文档的第二个案例&#xff0c;我删除了一些没用的注释&#xff0c;然后对代码做了一下注释的翻译&#xff0c;可以看一下意思。 package com.levi;import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; import …

MySQL优化常见面试题

文章目录 1.在MySQL中如何定位慢查询2.SQL语句执行很慢&#xff0c;如何分析3.什么是索引4.索引的底层结构了解过嘛5.B树和B树的区别是什么6.什么是聚簇索引什么是非聚簇索引7.什么是回表查询8.什么是覆盖索引9.MySQL超大分页如何处理10.索引创建原则有哪些11.什么情况下索引会…

【算法练习】29:插入排序学习笔记

一、插入排序的算法思想 原理&#xff1a;将一个无序的数据序列逐步转化为有序序列。算法将待排序的数组分为两个部分已排序部分和未排序部分。 时间复杂度&#xff1a;插入排序的时间复杂度在最坏、平均和最好情况下的表现相同&#xff0c;均为 &#xff0c;其中 n 是待排序数…

极狐GitLab对接OAuth2实现SSO

本文作者&#xff1a;极狐(GitLab) 高级解决方案架构师 武让 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 企…

Python处理PDF:在PDF文档中插入页眉和页脚

在处理篇幅较长、结构复杂的PDF文档时&#xff0c;页眉和页脚的设计与插入就显得尤为重要。它们不仅扮演着美化文档、提升专业度的角色&#xff0c;更承担了导航指引、信息标注的重要功能。 页眉通常用于展示文档的标题或章节名称&#xff0c;有助于读者在翻阅过程中迅速定位所…

Java - 赋值运算符

在这个实战中&#xff0c;我们将学习赋值运算符的使用方法。首先&#xff0c;我们将介绍简单赋值运算符的基本概念和语法格式。然后&#xff0c;我们将通过案例演示来加深对赋值运算符的理解。接下来&#xff0c;我们将对比Java和Python这两种不同的编程语言&#xff0c;探讨它…