news 2026/5/1 10:52:09

线性表之队列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
线性表之队列
  • 队列是限制在两端进行插入操作和删除操作的线性表
  • 允许进行存入操作的一端称为“队尾”允许进行删除操作的一端称为“队头”
  • 当线性表中没有元素时,称为“空队”
  • 特点 :先进先出(FIFO)或后进后出

  • 普通队列的缺点:
    • 出队后前面的空间无法重用,会造成“假溢出”
    • 当 sq->front > 0 且 sq->rear == N 时,虽然数组前面有空位,但队列已满
  • 在实际应用中,循环队列是更高效的选择,因为它避免了元素的移动,空间利用率更高。
  • 普通队列的主要缺点是空间浪费或需要移动元素的开销
  • 功能实现
#include<stdio.h>#include<stdlib.h>#include<string.h>sequeue*queue_create(){sequeue*sq;if((sq=(sequeue*)malloc(sizeof(sequeue)))==NULL){printf("malloc failed\n");returnNULL;}memset(sq->data,0,sizeof(sq->data));sq->front=sq->rear=0;returnsq;}intenqueue(sequeue*sq,datatype x){if(sq==NULL){printf("sq is NULL\n");return-1;}if(sq->rear==N){printf("sequeue is full\n");return-1;}sq->data[sq->rear]=x;sq->rear++;return0;}datatypedequeue(sequeue*sq){datatype ret;if(sq==NULL||sq->front==sq->rear){printf("queue is empty or NULL\n");return(datatype)-1;}ret=sq->data[sq->front];sq->front++;// 可选:当队列为空时,重置指针以重用空间if(sq->front==sq->rear){sq->front=sq->rear=0;}returnret;}intqueue_empty(sequeue*sq){if(sq==NULL){printf("sq is NULL\n");return-1;}return(sq->front==sq->rear?1:0);}intqueue_full(sequeue*sq){if(sq==NULL){printf("sq is NULL\n");return-1;}return(sq->rear==N?1:0);}intqueue_clear(sequeue*sq){if(sq==NULL){printf("sq is NULL\n");return-1;}sq->front=sq->rear=0;return0;}sequeue*queue_free(sequeue*sq){if(sq==NULL){printf("sq is NULL\n");returnNULL;}free(sq);returnNULL;}intqueue_length(sequeue*sq){if(sq==NULL){return-1;}returnsq->rear-sq->front;}
  • 头文件
#defineN100// 队列最大容量typedefintdatatype;// 数据类型typedefstruct{datatype data[N];// 存储队列元素intfront;// 队头指针intrear;// 队尾指针}sequeue;sequeue*queue_create();intenqueue(sequeue*sq,datatype x);datatypedequeue(sequeue*sq);intqueue_empty(sequeue*sq);intqueue_full(sequeue*sq);intqueue_clear(sequeue*sq);sequeue*queue_free(sequeue*sq);intqueue_length(sequeue*sq);
  • 测试文件
#include<stdio.h>#include"sequeue.h"intmain(intargc,constchar*argv[]){sequeue*sq;if((sq=queue_create())==NULL){return-1;}enqueue(sq,10);enqueue(sq,100);enqueue(sq,1000);while(!queue_empty(sq)){printf("dequeue:%d\n",dequeue(sq));}queue_free(sq);return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 17:39:19

C++ 多线程开发:从零开始的完整指南

一、为什么需要多线程&#xff1f; 在现代计算机体系结构中&#xff0c;多核处理器已成为标准配置。多线程编程允许我们充分利用这些计算资源&#xff0c;通过并行执行任务来提升程序性能。C11之前&#xff0c;多线程编程依赖于平台特定的API&#xff08;如POSIX pthreads、Win…

作者头像 李华
网站建设 2026/5/1 10:49:52

大型公司中优秀工程师为何也会写出糟糕代码

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

作者头像 李华
网站建设 2026/4/26 16:35:14

13、AWK 基础与正则表达式入门

AWK 基础与正则表达式入门 1. AWK 文件内容显示与过滤 AWK 命令可用于过滤文件内容,甚至处理非常大的文件。在过滤文件之前,我们可以先打印整个文件,以熟悉命令的语法。以下是打印 /etc/passwd 文件所有行的命令: $ awk { print } /etc/passwd这等同于使用 $0 变…

作者头像 李华
网站建设 2026/5/1 8:49:45

育儿实用技巧

目录 一&#xff0c;吃饭——明知故问法 八&#xff0c;网瘾 一&#xff0c;吃饭——明知故问法 2岁之前&#xff0c;我娃一直都是自主进食&#xff0c;我们边吃饭边说话对他没有影响。 满2岁之后&#xff0c;他开始听得懂我们说话的很多内容&#xff0c;他本来又是好奇心很…

作者头像 李华
网站建设 2026/5/1 9:12:47

AutoGPT在智能家居控制中的应用设想:语音指令到动作执行的链路打通

AutoGPT在智能家居控制中的应用设想&#xff1a;语音指令到动作执行的链路打通 在智能音箱能“听懂话”已成标配的今天&#xff0c;真正的挑战早已不再是“打开灯”这样的单步响应&#xff0c;而是如何理解那句模糊却充满生活气息的话——“我有点累&#xff0c;想安静一下”。…

作者头像 李华
网站建设 2026/5/1 10:02:15

交通信号仿真软件:Vistro_(3).Vistro用户界面与基本操作

Vistro用户界面与基本操作 在上一节中&#xff0c;我们已经介绍了Vistro的基本背景和应用场景。接下来&#xff0c;我们将深入探讨Vistro用户界面的布局和基本操作&#xff0c;帮助您更高效地使用该软件进行交通信号仿真。 用户界面布局 1. 主窗口 Vistro的主窗口是您进行大部分…

作者头像 李华