C语言队列的理解

2023-10-31

   队列是一种特殊的线性表,特殊之处在与允许在表的前端(front)进行删除操作,而在表ide后端进行插入操作,和栈一样,队列时一种操作受限制的线性表,进行

插入操作的端称为队尾,进行删除操作的端称为队头。

  队列的数据元素称为队列元素,在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队,因为队列只允许在一段插入,一端删除,所以只有最早进入队列

的元素才能从队列中删除,故队列由称为先进先出(fifo)

  顺序队列

     建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理,一个是队头指针front,它指向队头元素,一个是队尾指针rear,它指向下一个入队元素,位置,每次在队尾插入一个元素,rear增加1;每次在队头删除一个元素,front增加1,随着插入和删除的操作进行,队列元素的各数不断变化,队列占的存储空间在队列结构分配的连续空间中移动,当Front=rear时,队列中每有任何元素,称为空队列,当rear增加到指向分配的连续空间之外,队列无法在插入新元素,但这时往往还有大量的可用的空间未被占用,这些空间是已经出对的队列元素占用过的存储单元。

    队尾指针指向队尾元素的下一个位置(也可以让rear指向队尾元素,front指向队头元素的前一个位置,)


循环队列

   在实际使用队列时,为了使队列空间能重复使用,往往对队列的使用方法稍加改进,无论插入或删除,一旦rear指针增加1或front指针增加1时超出分配的队列空间,就让它执行这片连续空间的起始位置,自己真从MaxSize-1曾1变到0,可用取运算rear% Maxsize和Front%MaxSize来实现,这实际上是吧队列空间想象成一个环形空间,环形空间中存储短语循环使用,用这种方法管理的队列称为循环队列,

在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满,也有front=rear,为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩一个存储单元时,队列就已经满了,因此,队列判空时front=rear,而队列判满时front=(rear+1)%MaxSize.


typedef struct QNode{

  ElemType data;

  struct QNode *next;

}QNode;


typedef struct LinkQueue{

  QNode *front;      //指向队头元素

  QNode *rear;    //指向队尾元素

}LinkQueue;


 Status InitQueue(LinkQueue *q)

{

    q->front=q->rear=(QNode*)malloc(sizeof(QNode));   //分配内存空间

       if(!q->front)

         return error;

      q->front->next=null;

    return OK;

}


Status EnQueue(LinkQueue *q,ElemType e)   //插入队列

{

    QNode *p=(QNode*)malloc(sizeof(QNode));

    if(!p)

      return error;

    p->data=e;

   p->next=null;

   p->rear->next=p;   //将新地址保存,入队操作,从队尾(rear)进入

   q->rear=p;   //相当于rear++,q->rear指向下一个位置  符合入队操作的基本要求

   return OK;

}


Status DeQueue(LinkQueue *q,ElemType *e)

{

    QNode *p=(QNode *)malloc(sizeof(QNode));

    if(!p)

      return error;

    p=q->front->next;//q 指向的是Front指针的下一个位置,即队首元素。

   *e=p->data;

   q->front->next=p->next;//出队操作后,Front++

   if(q->rear==p)//判断是否全部出队

       q->rear=q->front;//如果全部出队,则将队列置为空

  return ok;

    

}


在循环队列中,Q->front==Q->rear并不能确定队列为空,也有可能是队列已满,所以采用队列头指针在队尾指针的下一位置来判断队列已满(此方法会浪费一个内存空间)。


#define MAXQSIZE  100

typedef struct

{

    QElemType *base;

   int front;

   int rear;

   int queuesize;


}SqQueue;


Status InitQueue(SqQueue *Q)

{

    Q->queuesize=MAXQSIZE;

    Q->base=(QElemType*)malloc(Q->queuesize *sizeof(QElemType));

    if(Q->base==NULL)

    {

return ERROR;

     }

    Q->front=Q->rear=0;

     return OK;

}

int QueueLength(SqQueue *Q)

{

      return((Q->rear-Q->front+Q->queuesize)%Q->queuesize);

}

Status EnQueue(SqQueue *Q,QEletype e)

{

//在循环队列中,Q->front==Q->rear并不能确定,队列为空,也有可能是队列已满

//所以采用队列头指针在队尾指针的下一位置来判断队列已满

  if((Q->rear+1)%Q->queuesize==Q->front)

 {

      Q->base =(QElemType*)realloc(Q->base,Q->queuesize);

    if(Q->base==null)

      return error;

     Q->queuesize*=2;

 }

  Q->bse[Q->rear]=e;

  Q->rear=(Q->rear+1)%Q->queuesize;

   return OK;

}


Status DeQueue(SqQueue *Q,QElemType *e)

{

   if(Q->front==Q->rear)

   {

      return error;

   }

   *e=Q->base[Q->front];

   Q->front=(Q->front+1)%Q->queuesize;

   return OK;

}

Status DestroyQueue(SqQueue*Q)

{

    free(Q->base);

     return OK;

}

int main()

{

   SqQueue Q;

   QElemType e;

    int i;

    InitQueue(&Q)

   for(i=0;i<MAXQSIZE*10;++i)

  {

      if(EnQueue(&Q,i)!=OK)

         return -1;

     while(Q.front!=Q.rear)

       {

DeQueue(&Q,&e);

                printf("%d\n",e);

       }

    DestroyQueue(&Q);

    return 0;

  }

}








本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言队列的理解 的相关文章

  • Java基础--------网络编程

    参考http www cnblogs com xdp gacl p 3631965 html 点击打开链接 以此为模板 自己做了整理 修改 目录 一 网络的概念 二 网络通信协议及接口 2 1 通信协议分层思想 2 2 参考模型 三 IP
  • AD怎么设置相同网络的线宽

    一 对网络进行分类 快捷键 D C 在弹出的面板中找到 net class 单击右键 选择 Add Class 二 选择网络 选中Net Classes中刚刚建好的类POWER 按住CTRL键 在Non Members中选择5V 20V 先
  • 最强nba体验服显示服务器正在停机,最强NBA玩不了怎么办 游戏进不去玩不了原因分析及解决方法...

    对于一些刚下载好游戏的萌新玩家来说 最头疼的可能就是游戏进不去或玩不了了 那么最强NBA玩不了怎么办 不要慌 小编这就给大家分析下游戏玩不了或进不去的各种原因以及解决方法 类别 体育竞技 大小 471 34M 语言 简体中文 评分 10 最
  • golang for range循环坑

    比较两段代码 package main import fmt func main a int 1 2 3 4 5 6 7 8 9 for len a gt 0 a a 1 fmt Println a 输出 2 3 4 5 6 7 8 9 3
  • 分布式概念

    集群与分布式区别 集群 复制模式 每台机器做一样的事 分布式 两台机器分工合作 每台机器做的不一样 分布式好处 独立开发 部署 测试 易于扩展 复用性高 例如 所有的产品都可以使用该系统作为用户系统 无需重复开发 架构演进 架构演进一 早期
  • python 如何查看模块所有方法-Python查看模块(变量、函数、类)方法

    常用五种方法 前提是要先导入这个包 然后用下面的方法去查看 这名称 可是包 方法 或 类 1 help 名称 2 名称 doc 3 dir 模块名 List item 通过 dir 函数获取到的模块成员 不仅包含供外部文件使用的成员 还包含
  • PySide6/PyQT多线程之 高效管理多线程:暂停、恢复和停止的最佳实践

    前言 关于 PySide6 PyQT 多线程 正确地处理多线程编程并确保线程之间的同步和通信并不容易 本文以一个示例代码为基础 介绍 PySide6 PyQT多线程的运用 展示如何创建和管理线程 以及如何实现线程之间的同步和通信 设想这么一
  • python 切换root 执行命令

    如下 以创建系统用户举例 配置文件配置普通用户信息 登入后切换root用户 创建一个指定名字和密码的系统用户 def create user root pwd username password import paramiko result
  • STM32 RST管脚上拉后一直是0.1V左右的低电平,恶心,终于找到原因,焊锡膏啊

    给自己以后提醒 这次做的STM32平衡车的板子 发现仿真器一直烧写不进去 提示 core is held 先看魔术棒 排除了仿真器连接的问题 上网搜 core is held 原因 网友说应该是复位脚RST的电平没有拉高 但是我的原理图上已
  • 原码、反码、补码基本概念

    基本概念 原码 符号位加上真值的绝对值 也就是第一位表示符号 其余位表示值 0为正值 1为负值 原码是人脑最容易理解和计算的表示方式 反码 正数的反码是其本身 负数的反码是在其原码的基础上符号位不变 其余各位取反 一个反码表示的负数是无法无
  • Golang学习笔记:递归函数

    接前面java写的递归例子 还是计算一个数递减相乘 func test01 n int int result 0 if n lt 1 return 1 else result test01 n 1 n return result 执行一个函
  • IDEA个性化设置注释模板(详细版)

    IDEA设置注释模板 类注释模板 方法注释模板 效果展示 1 类注释模板 类注释模板是IDEA创建类时生成的注释 第一步 File gt Settings 第二步 Editor gt File and Code Templates gt I
  • 苹果核 - 页面动态化的基础 —— Tangram

    12月10日在SFDC SegmentFault Developer Conference 大会上初次介绍了手机天猫的Tangram方案 现场时间有限 讲得匆忙 特此整理记录 这篇内容是Tangram的整体介绍与相关业务开发实践的介绍 后续
  • 一网打尽当下NoSQL类型、适用场景及使用公司

    在过去几年 关系型数据库一直是数据持久化的唯一选择 数据工作者考虑的也只是在这些传统数据库中做筛选 比如SQL Server Oracle或者是MySQL 甚至是做一些默认的选择 比如使用 NET的一般会选择SQL Server 使用Jav
  • 图像处理:RGB与YCbCr

    简要概述一下RGB与YCbCr 方便记忆 RGB与YCbCr都是人为规定的色彩空间 同一种颜色既可以用RGB来表达 存储 也可以用YCbCr来表达 存储 就如同二进制数1111与十进制数15一样 形式不同但是表达的内容是相同的 1 RGB
  • ubuntu关机后无法进入系统

    原因 ubuntu提示内存不足后 关机扩容再次开机 黑屏卡死无法进入登录界面 解决 参考下面的博客 进入Ubuntu Linux Recovery Mode 删除一些目录 释放内存空间后 完美解决 ubuntu黑屏无法进入系统 Recove
  • 章节1 概述 - Segger SystemView使用手册(译文)

    本文博客链接 http blog csdn net bjr2016 作者 bjr2016 未经允许不得转载 1 概述 本节描述SEGGER SystemView的一般使用 1 1 SEGGER SystemView 是什么 SystemVi
  • selenium 网页自动化-在访问一个网页时弹出的浏览器窗口,我该如何处理?

    前言 相信大家在使用selenium做网页自动化时 会遇到如下这样的一个场景 在你使用get访问某一个网址时 会在页面中弹出如上图所示的弹出框 首先想到是利用Alert类来处理它 然而 很不幸 Alert类处理的结果就是没有结果 并不能够将
  • TS如何解决属性在另一个类型中不存在的问题?

    先来看一个例子 export interface Cat coatColor string 毛色 varieties string 品种 weight number 体重 meow gt void 喵喵叫 export interface
  • XSS笔记

    一 xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中 通过用户本地浏览器执行的 所以xss漏洞关键就是寻找参数未过滤的输出函数 二 XSS的攻击方式 1 反射型XSS lt 非持久化 gt 攻击者事先制作好

随机推荐

  • 魅蓝5s 显示无服务器,魅蓝5s评测:只为让你机不离手

    其实对于魅族来说 搞魅蓝全家桶算是一种无奈的选择 毕竟之前只能用联发科的处理器 想在高端市场发力也是拳头打在棉花上有力使不出的感觉 不过换一个角度来思考 魅族对于那块联发科处理器的打磨相对于别家来讲自然是更有经验的 所以魅族能够更加放心而大
  • 手动添加Windows右键菜单即图标 Sublime Text举例

    有时候想把软件添加到右键菜单 可以这样做 1 Window R 打开 运行 regedit 进入组侧表 2 找到HKEY CLASSES ROOT gt gt shell下 新建项命名为Sublime Text 3 即路径为HKEY CLA
  • 码猿之道

    既不是最强的 也不是最聪明的 而是最能适应变化的生存了下来 达尔文 抓紧智能时代的缰绳 2016年是计算机历史上一个具有纪念意义的年份 它是一个旧时代的终结 也是一个新时代的开始 这一年距离1956年麦卡锡 明斯基 香农等计算机先贤提出人工
  • Python基础学完了再学什么?

    Python基础学完了再学什么 基础阶段学完Python 基础语法 python 容器 函数和文件操作 面向对象 python编程和web基础 Linux 操作系统多任务编程 Python 网络编程 静态 web 服务器 HTML CSS
  • HTML实现简单的注册页面

    HTML是一种标记语言 用于创建网页 这里使用HTML创建了一个简单的注册页面 其中包含表单元素 如文本框 密码框 单选按钮 下拉列表 文件上传和文本域 先看看效果图 代码如下
  • 可视化图片时显示中文标签

    coding UTF 8 import cv2 import glob import os from PIL import Image ImageFont ImageDraw import numpy as np color 0 255 0
  • 无线连接让智能手表用户可以自行沟通和监控

    诸如智能手表和智能眼镜之类的产品正在激增 它们中的大多数由于多个传感器 低功耗嵌入式处理器 直视或虚拟显示器以及无线通信链路 Wi Fi或蓝牙 来连接到智能手机 从而提供各种功能 主机系统 或互联网 尽管这些高度集成的系统中有许多提供了所需
  • Flutter: Dart 参数,以及 @required 与 required

    1 Dart 参数 Dart 函数的参数分 3 种类型 位置参数 命名参数 可选位置参数 1 1 位置参数 positional parameters 参数位置重要 名称任意 定义 void debugger String message
  • uniapp开发的App(安卓)端跳转uniapp微信小程序

    本文总结两种跳转方法 适合自己的才是最好的 1 根据微信开放文档提供的方法获取小程序的URL 两种 小程序的URL Scheme weixin dl business t TICKET 小程序的URL Link https wxaurl c
  • 宝塔控制面板无法访问,浏览器提示连接失败

    防火墙已经关闭 端口已经开好 但宝塔控制面板无法访问 浏览器提示连接失败 错误信息 火狐浏览器提示连接失败 解决思路 连接ssl重启宝塔 宝塔重启命令 bt restart
  • 全国地区树形结构列表。TreeNode工具

    Select select from shop region order by id ResultType java util LinkedList class 虽然这里用了LinkedList 但好像后面并没有用到 List
  • 三色标记算法

    什么是三色标记 CMS的运行过程中存在并发标记过程 由于不产生STW 所以对垃圾的清理必须存在标记和删除两个过程分开 而不能看到是垃圾就直接清除 否则会引起不必要的麻烦 CMS为了解决这个问题 采用了三色标记算法来记录对象是否已经被扫描过
  • 环境篇-在Qt工程中调用OpenSSL

    本文属于 OpenSSL加密算法库使用系列教程 之一 欢迎查看其它文章 我们知道OpenSSL有一个命令行工具openssl exe 可以通过命令实现很多的操作 同时OpenSSL还提供了动态库 所以如果我们想调用OpenSSL 有2种方法
  • 树的应用举例

    二叉树 先序遍历 这里指根在先 from collections import deque class BitTree def init self self root None def insert self node pos pass s
  • meilisearch使用记录

    分页 查找内容 默认一页十条 def search q from size 10 return client index indexName search q opt params limit size offset from 当前页 st
  • 剖析RedHat Linux中三个重要内核文件

    在网络中 不少服务器采用的是Linux系统 为了进一步提高服务器的性能 可能需要根据特定的硬件及需求重新编译Linux内核 编译Linux内核 需要根据规定的步骤进行 编译内核过程中涉及到几个重要的文件 比如对于RedHat Linux 在
  • (简单成功)原生js实现点击复制文本

    目录 背景 核心代码 案例 背景 我们开发中可能会有点击复制的功能 那么下面将讲述 核心代码 select 方法用于选择该元素中的文本 document execCommand copy 执行浏览器复制命令 案例
  • 微信网页调用jssdk扫一扫,63002报错的坑,ios的兼容问题

    一 因为项目需要用到微信网页扫一扫功能 并且去找了很多文章都没有统一的整理 所以就整理了一下 比较常见的坑 1 如何在网页调用扫一扫功能 1 先引入npm npm install weixin js sdk 如果你需要用微信的支付那些api
  • PWN学习-ADworld刷题

    前言 搁置了一段时间没更博 经历了考试还有一些其他事 决心好好去学pwn 学习的方法打算是按照看视频课加刷题加查找资料来学习 先把新手题都刷了一遍 都是很入门的题目 没啥好提的 收获也少 然后去刷进阶的题 但是目前还没有遇到堆的题目 视频课
  • C语言队列的理解

    队列是一种特殊的线性表 特殊之处在与允许在表的前端 front 进行删除操作 而在表ide后端进行插入操作 和栈一样 队列时一种操作受限制的线性表 进行 插入操作的端称为队尾 进行删除操作的端称为队头 队列的数据元素称为队列元素 在队列中插