news 2026/6/10 14:25:59

线性表之队列

作者头像

张小明

前端开发工程师

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/6/10 10:25:22

十字路口的抉择:B端与C端C++开发者的职业路径全解析

在C开发者的职业道路上&#xff0c;一个经典的选择题横亘在前&#xff1a;是深入服务企业与系统的B端&#xff08;Business&#xff09; 领域&#xff0c;还是投身于创造直接用户价值的C端&#xff08;Consumer&#xff09; 世界&#xff1f;这不仅是一个技术栈的选择&#xff…

作者头像 李华
网站建设 2026/6/8 11:26:45

8、脚本编程中的替代语法与循环结构

脚本编程中的替代语法与循环结构 1. 正则表达式脚本 在脚本编写中,使用正则表达式进行条件测试是一项很实用的技能。例如,我们可以处理美式英语和英式英语中“color”的不同拼写,即“color”和“colour”。以下是实现该功能的脚本代码: if [[ $REPLY =~ colou?r ]] ; …

作者头像 李华
网站建设 2026/6/8 12:27:01

11、流编辑器(sed)与 Apache 虚拟主机自动化

流编辑器(sed)与 Apache 虚拟主机自动化 1. 流编辑器(sed)基础操作 1.1 执行脚本与文件格式化 在命令行中,我们可以使用以下命令执行脚本并处理当前目录下的 UPPMT 目录文件: $ parsecsv.sh tools通过这个命令,我们能以更易读的方式格式化文件,让普通文本文件不…

作者头像 李华
网站建设 2026/6/10 14:01:40

AXI-A7.4.7 Transaction structure

一、AtomicLoad、AtomicSwap和AtomicCompare这三类原子操作的事务结构和执行规则 AXI协议中AtomicLoad、AtomicSwap和AtomicCompare这三类原子操作的事务结构和执行规则。原子操作的核心特点是“读-修改-写”的不可分割性,即操作在执行过程中不会被其他访问打断,且对外界表现…

作者头像 李华
网站建设 2026/6/10 13:55:26

交通信号仿真软件:Vistro_(7).行人与非机动车仿真

行人与非机动车仿真 在交通仿真中&#xff0c;行人和非机动车的模拟是非常重要的一部分&#xff0c;它们不仅影响道路的安全性和效率&#xff0c;还关系到城市的可持续发展和居民的生活质量。本节将详细介绍如何在仿真软件中进行行人和非机动车的建模与仿真&#xff0c;包括它们…

作者头像 李华
网站建设 2026/6/10 4:28:23

交通信号仿真软件:Vistro_(14).交通仿真在城市规划中的应用

交通仿真在城市规划中的应用 在城市规划中&#xff0c;交通仿真软件是不可或缺的工具之一。通过交通仿真&#xff0c;规划师可以预测和评估交通流量、拥堵情况、交通事故风险等&#xff0c;从而优化交通系统&#xff0c;提高城市居民的出行效率和生活质量。本节将详细介绍交通仿…

作者头像 李华