数据结构学习笔记--队列

引子:只有学习才是激情的生命,才是燃烧的岁月,才是完美的人生

声明:本笔记由《嵌入式系统软件设计中的数据结构》产生,旨在提升自己的软件设计水平,绝无侵权行为,望转载者备注说明

一 队列逻辑结构

1 是一种只允许在表的一端-“队尾“进行插入,而在另一端-”队头“进行删除的线性表。实则为线性表的一种特例。也称为先进先出表
2 当队列中没有结点时称为空队列。队列的修改是依照先进先出的原则进行的

二 队列的基本运算

置空队 SetNull(Q):将队列 Q 置成空的队列

判队空 Empty(Q):若 Q 为空队列,返回”真“,否则为”假“

取头结点 GetFront(Q):读取队列 Q 的头结点的值,队列中的结点保持不变

入队 InQuery(Q, x):将结点 x 插入到队列 Q 的队尾

出队 DeQuery(Q):删除队列头结点

三 队列分类

1 顺序队列 

 采用顺序存储结构,实则为运算受限的顺序表,可用一维数组来存放结点数据

 front 指示队列当前队头结点的数组下标的位置

 rear 指示队列当前队尾结点的数组下标的位置

 结构描述

 +++++++++++++++++++++++++++++++++++++++++++++++

  #define maxsize 1024                                                                

  typedef int datatype;                                                                    

  typedef struct                                                                                    

  {                                                                                                       

     datatype data[maxsize];    //存放数据元素的一维数组                                                       

     int front;                                //头结点                                                       

     int rear;                                 //尾结点                                                       

  }sequery;                                                                                       

++++++++++++++++++++++++++++++++++++++++++++++++

顺序队列的队头和队尾的标志位置分析

front指向当前队列头结点的前一个位置

rear指向当前队列尾结点的位置

队列的溢出情况分析

出队运算:front++;//头指针 +1

当空队时,front = rear,若再做出队操作,会产生“下溢”

入队运算:rear++;//尾指针 +1

                    data[rear] =  x; //x 入队

当队满时,再做入队操作会产生“上溢”

假上溢 原因:被删除的结点(出队结点)的空间永远不能再使用

2 循环队列

将顺序队列首尾相连,即 data[0] 接在 data[max - 1] 之后

循环队列克服假上溢:

若当前尾指针等于数组的上界(max - 1),再做入队操作时,令尾指针等于数组的下界(0)

入队:rear = (rear + 1) % max;

            data[rear] = x;

出队:front = (front + 1) % max;

循环队列队空队满情况:

少用一个结点空间,即头结点指向的空间不使用

队空:front = rear

队满:(rear + 1) % max = front;

循环队列的运算

+++++++++++++++++++++++++++++++++++++++++++++++++++++

/* 置空队 */

void SetNull(sequeue * sq)

{

    sq->front = 0;

    sq->rear = 0;

}

/* 判队空 */

int Empty(sequeue * sq)

{

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

        return 1;

    else

        return 0;

}

/* 取头结点 */

datatype GetFront(sequeue *sq)

{

    if (Empty(sq))

    {

        printf("queue is null");

        return(NULL);

        /**

         * For GCC Warning

         */

    }

    else

        return(sq->data[(sq->front+1)%max]);

}

/* 入队 */

int InQueue(sequeue * sq, datatype x)

{

    if ((rear + 1)%max == sq->front)

    {

        printf("queue is full");

        return(NULL);

    }

    else

    {

        sq->rear = (sq->rear+1)%max;

        sq->data[sq->rear] = x;

        return 1;

    }

}

/* 出队 */

datatype DeQueue(sequeue * sq)

{

    if (Empty(sq))

    {

        printf("queue is full");

        return(NULL);

    }

    else

    {

        sq->front = (sq->front+1)%max;

        return(sq->data[sq->front]);

    }

}

+++++++++++++++++++++++++++++++++++++++++++++++++++++

3 链队列

采用链式存储的队列,类似单链表,但其操作受限,只允许在表头删除节点和在表为插入节点

未完待续

时间: 2024-08-31 14:53:35

数据结构学习笔记--队列的相关文章

数据结构学习笔记

在网上有较多的数据结构视频课,我通过学习邓俊辉的网课免费视频来学习的.他的视频讲得还很详细,比较适合刚入门的与那些即将毕业,找工作但是数据结构比较薄弱的同学来学习. 向量 有很多接口方法. 可扩充向量:总容量capacity,size当前的实际规模.当size不及capacity一半是,会下溢(装填因子=size/capacity). 动态空间管理:当即将上溢时,就会适当的扩容.

Spring学习笔记3之消息队列(rabbitmq)发送邮件功能_java

rabbitmq简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过 队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求.其中较为成熟的MQ产品有IBM WEBSPHERE MQ. 本节的内容是用户注册时,将邮

php5学习笔记(转)

php5|笔记 作者: whhwq在phpv.net看到的感觉不错/*+-------------------------------------------------------------------------------+| = 本文为Haohappy读<<Core PHP Programming>> | = 中Classes and Objects一章的笔记 | = 翻译为主+个人心得 | = 为避免可能发生的不必要的麻烦请勿转载,谢谢 | = 欢迎批评指正,希望和所有

数据库学习笔记(一)

笔记|数据|数据库 这是我学习数据库时候的笔记,都是非常简单,非常基础的有关数据库的知识,最近整理一下,希望大家不要蛋蛋我啊,呵呵 数据库学习笔记(一)                         --绪论及基本概念 一,             数据:描述事物的符号记录称为数据. 二,             数据库:指长期存储在计算机内的.有组织.可共享的数据集合. 三,             数据库管理系统:数据管理的软件,主要以下功能:                   1, 

Duwamish7学习笔记1

笔记 Duwamish7学习笔记(-)   Duwamish解决方案总共有6个项目,结构上分为5层:业务外观层(BusinessFacade).业务规则层(BusinessRules).业务实体层(Common).数据访问层(DataAccess).业务展示层(Web).另外一项目为SystemFrameWork,顾名思意,主要是用来进行整个系统构架的一些配置.跟踪.日志等.  Common项目  1.让我们来看一看Duwamish7的数据结构,图1        2.对数据库中Book,Cat

作为一个新手的Oracle(DBA)学习笔记

Oracle数据库笔记 Jack Chaing 作者QQ595696297 交流群 127591054 祝大家学习进步. 如果大家想看Word版本的可以去下载:Word排版比较清晰一些. http://download.csdn.net/detail/jack__chiang/9810532 此笔记是作者本人去年开始从一个DBA新人的学习笔记,积累至今,希望拿出来给那些对DBA有兴趣的童孩学习,大家一起努力嘛. 此笔记记录了作者工作学习中从零基础的学习的记录,和从中遇见的问题与问题的解决!很高兴

Akka学习笔记(五):Akka与Java的内存模型

Akka学习笔记(五):Akka与Java的内存模型 Akka简化了编写并发软件的过程,本文主要讨论Akka如何在并发应用中访问共享内存. Java内存模型 Java5之前的JMM是相当混乱的.多线程访问共享内存很有可能会得奇怪的结果,如: 可见性问题,无法及时看到其他线程写入的值 指令乱序,观测到其他线程不可能的行为 从Java 5的JSR 133的实现,很多问题就解决了.JMM是基于一组"happens-before"关联规则,限制了访问内存的行为必须在另一个内存访问行为之前发生.

thinkphp学习笔记4—眼花缭乱的配置

原文:thinkphp学习笔记4-眼花缭乱的配置   1.配置类别 ThinkPHP提供了灵活的全局配置功能,ThinkPHP会依次加载管理配置>项目配置>调试配置>分组配置>扩展配置>动态配置,所以后面的配置权限要大于前面的,因为后面的配置会覆盖前面同名配置,同事会生辰配置缓存文件无需重复解析,减小开销. 惯例配置:在惯例配置内对大多数常用参数进行默认配置,因为惯例配置最先加载,优先级别最低,如果不需要做特殊配置的话,完全可以保持默认值,惯例配置位于ThinkPHP/Con

Mysql学习笔记(九)索引查询优化

原文:Mysql学习笔记(九)索引查询优化 PS:上网再次看了一下数据库关于索引的一些细节...感觉自己学的东西有点少...又再次的啃了啃索引.... 学习内容: 索引查询优化... 上一章说道的索引还不是特别的详细,再补充一些具体的细节... 1.B-Tree索引... B-tree结构被称为平衡多路查找树...其数据结构为:     这就是其数据结构图...我们没必要完全的理解其中的原理..并且我也不会做过多的原理介绍...我们只需要知道数据库是以这种方式进行存储数据的就可以了...   m