数据结构:队列

server/2025/2/13 10:43:16/

1.概念:

和栈相反,队列是一种先进先出的线性表它只允许在标的一段进行插入,而在另一端进行删除元素。这和我们日常生活中的排队是一致的,即最早入队的元素最早离开。队列中允许插入的一端叫做队尾,允许删除的一端的叫队头。

2.队列的基本操作:

1.入队

2.出队

3.队列初始化,判空以及获取出队元素

3.代码实现

一.链队列(队列用链表表示和实现)

#include <stdio.h>
#include <stdlib.h>typedef struct qnode {int data;struct qnode* next;
} qnode, *qptr;typedef struct {qptr front;qptr rear;
} linkq;// 初始化队列
void initq(linkq* q) {q->front = q->rear = (qptr)malloc(sizeof(qnode));q->front->next = NULL;  // 初始化时,队列为空,front 和 rear 都指向头节点
}// 入队操作
void enquence(linkq* q, int e) {qptr p = (qptr)malloc(sizeof(qnode));p->data = e;p->next = NULL;q->rear->next = p;q->rear = p;printf("入队元素为:%d\n", e);
}// 出队操作
int dequence(linkq* q, int* e) {if (q->front == q->rear) {printf("队列为空,无法出队\n");return -1;  // 返回-1表示队列为空}qptr p = q->front->next;*e = p->data;q->front->next = p->next;if (q->rear == p) {q->rear = q->front;  // 如果出队的是最后一个元素,rear 需要指向 front}free(p);return 0;  // 返回0表示出队成功
}int main() {linkq q;int e, e1, e2;initq(&q);  // 初始化队列enquence(&q, 0);  // 入队元素0enquence(&q, 1);  // 入队元素1enquence(&q, 2);  // 入队元素2if (dequence(&q, &e) == 0) {  // 出队元素0printf("出队元素为:%d\n", e);}if (dequence(&q, &e1) == 0) {  // 出队元素1printf("出队元素为:%d\n", e1);}if (dequence(&q, &e2) == 0) {  // 出队元素2printf("出队元素为:%d\n", e2);}return 0;
}

运行结果

入队元素为:0
入队元素为:1
入队元素为:2
出队元素为:0
出队元素为:1
出队元素为:2

二.循环队列(队列的顺序表示和实现)

#include <stdio.h>
#include <stdlib.h>#define MAXSIZE 100typedef struct {int *base;  // 队列的存储空间int front;  // 队头指针int rear;   // 队尾指针
} sq;// 初始化队列
void init(sq *p) {p->base = (int *)malloc(MAXSIZE * sizeof(int));  // 分配足够的空间if (p->base == NULL) {printf("内存分配失败\n");exit(1);  // 如果分配失败,退出程序}p->front = p->rear = 0;  // 初始化队头和队尾
}// 计算队列长度
int sqlength(sq p) {return (p.rear - p.front + MAXSIZE) % MAXSIZE;
}// 入队操作
void ensq(sq *p, int e) {if ((p->rear + 1) % MAXSIZE == p->front) {  // 判断队列是否已满printf("队列已满,无法入队\n");return;}p->base[p->rear] = e;  // 将元素插入队尾p->rear = (p->rear + 1) % MAXSIZE;  // 队尾指针后移printf("入队元素为:%d\n", e);
}// 出队操作
int desq(sq *p) {if (p->front == p->rear) {  // 判断队列是否为空printf("队列为空,无法出队\n");return -1;  // 返回-1表示队列为空}int e = p->base[p->front];  // 获取队头元素p->front = (p->front + 1) % MAXSIZE;  // 队头指针后移return e;  // 返回出队元素
}int main() {sq p;int e1, e2, e3;init(&p);  // 初始化队列ensq(&p, 1);  // 入队元素1ensq(&p, 2);  // 入队元素2ensq(&p, 3);  // 入队元素3e1 = desq(&p);  // 出队元素1if (e1 != -1) {printf("出队元素为:%d\n", e1);}e2 = desq(&p);  // 出队元素2if (e2 != -1) {printf("出队元素为:%d\n", e2);}e3 = desq(&p);  // 出队元素3if (e3 != -1) {printf("出队元素为:%d\n", e3);}free(p.base);  // 释放队列的存储空间return 0;
}

运行结果

入队元素为:1
入队元素为:2
入队元素为:3
出队元素为:1
出队元素为:2
出队元素为:3

4.应用场景:

  • 顺序队列:适合元素数量固定的场景,需要处理“假溢出”问题。

  • 链式队列:适合元素数量不固定的场景,动态分配内存,无需担心队列大小限制。

  • 队列的应用场景包括任务调度、缓冲区管理、广度优先搜索(BFS)等。

5.优缺点:


优点:
1.顺序性保障:严格按顺序处理数据:队列确保元素按到达顺序被处理,适用于需保证公平性的场景(如打印机任务调度)。
应用示例:广度优先搜索(BFS)算法依赖队列
维护待访问节点的顺序。
2.缓冲作用
速率匹配:平衡生产者和消费者的处理速度差异(如视频流缓冲)。
3.实现简单高效 

时间复杂度低:入队和出队操作在数组/链表实现中均可达到**O(1)**时间复杂度。内存连续性:数组实现的队列(如循环队列)能利用CPU缓存局部性优势。
缺点:
1.访问限制
无法随机访问:中间元素需逐个出队才能访问,时间复杂度升至O(n)。
2.容量限制
固定大小问题:循环队列需预分配空间,动态扩容可能引发性能抖动。示例:Java的 ArrayBlockingQueue 需预设容量,而 LinkedBlockingQueue支持无界但有内
存风险。
3.并发复杂度
线程安全开销:并发队列(如ConcurrentLinkedQueue)需通过CAS操作保证安全,增加实现难度。
 

 


http://www.ppmy.cn/server/167301.html

相关文章

【云安全】云原生-K8S- API Server 未授权访问

API Server 是 Kubernetes 集群的核心管理接口&#xff0c;所有资源请求和操作都通过 kube-apiserver 提供的 API 进行处理。默认情况下&#xff0c;API Server 会监听两个端口&#xff1a;8080 和 6443。如果配置不当&#xff0c;可能会导致未授权访问的安全风险。 8080 端口…

曝苹果2026年秋季推首款折叠iPhone

一、苹果折叠iPhone的发布背景与意义 在智能手机市场中&#xff0c;折叠屏手机近年来发展迅猛&#xff0c;成为行业的新趋势。苹果公司在这一领域的动作相对迟缓&#xff0c;但随着技术的不断成熟和市场需求的增长&#xff0c;苹果也终于准备推出首款折叠iPhone。这不仅是苹果自…

UI-设计规范大小总结

移动端 iOS 系统 设计尺寸&#xff1a;iPhone 16 Pro 以 402874 为标准尺寸&#xff1b;iPhone 14 Pro 屏幕尺寸 6.1 英寸&#xff0c;分辨率 25561179 像素&#xff1b;iPhone 14 Pro Max 屏幕尺寸 6.7 英寸&#xff0c;分辨率 27961290 像素。图标尺寸&#xff1a;App Store…

苍穹外卖学习

软件开发整体介绍 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程&#xff0c; 以及软件开发过程中涉及到的岗位角色&#xff0c;角色的分工、职责&#xff0c; 并了解软件开发中涉及到的三种软件环境。那么这一小节&#xff0c;我们将从 软件开发流程、角色…

【安全靶场】信息收集靶场

靶场&#xff1a;https://app.hackinghub.io/hubs/prison-hack 信息收集 子域名收集 1.subfinder files.jabprisons.com staging.jabprisons.com cobrowse.jabprisons.com a1.top.jabprisons.com cf1.jabprisons.com va.cobrowse.jabprisons.com vs.jabprisons.com c…

WIN服务器快捷命令大全

以下是一些 Windows 服务器上常用的快捷命令大全&#xff1a; 文件和目录操作&#xff1a; dir: 列出当前目录下的文件和子目录。cd: 切换目录。mkdir: 创建新目录。rmdir: 删除目录。del: 删除文件。copy: 复制文件。move: 移动文件。 系统信息和管理&#xff1a; systeminfo…

TextWebSocketHandler 和 @ServerEndpoint 各自实现 WebSocket 服务器

TextWebSocketHandler 和 ServerEndpoint 都可以用于实现 WebSocket 服务器&#xff0c;但它们属于不同的技术栈&#xff0c;使用方式和功能有一些区别。以下是它们的对比&#xff1a; 1. 技术栈对比 特性TextWebSocketHandler (Spring)ServerEndpoint (Java EE/JSR-356)所属框…

【云安全】云原生-K8S- kubeconfig 文件泄露

什么是 kubeconfig 文件&#xff1f; kubeconfig 文件是 Kubernetes 的配置文件&#xff0c;用于存储集群的访问凭证、API Server 的地址和认证信息&#xff0c;允许用户和 kubectl 等工具与 Kubernetes 集群进行交互。它通常包含多个集群的配置&#xff0c;支持通过上下文&am…