25考研数据结构复习·3.2队列

队列(Queue)基本概念

  • 定义

    队列(Queue)只允许在一端进行插入,在另一端删除线性表

    特点:先进入队列的元素先出队

    先进先出 First In First Out(FIFO)

    • 重要术语

      队头、队尾、空队列

 

  • 基本操作

    • 创、销

      InitQueue(&Q):初始化队列。构造一个空队列Q。

      DestroyQueue(&Q):销毁队列。销毁并释放队列Q所占用的内存空间

    • 增、删

      EnQueue(&Q,x):入队,若队列Q未满,则将x加入使之成为新队尾

      DeQueue(&Q,&x):出队,若队列Q非空,则删除对头元素,并用x返回。

      删除队头元素

    • 查:队列的使用场景中大多之访问对头空间。

      GetHead(Q,&x):读队头元素。若队列Q非空,则将对头元素赋值给x。

      不删除队头元素

    • 其他常用操作

      QueueEmpty(Q):判队列空。若队列Q为空返回true,否则返回false

队列的顺序实现

  • 用顺序存储实现队列

#define MaxSize 10       //定义队列中元素的最大个数
typedef struct{//静态数组:连续的存储空间,大小MaxSize*sizeof(ElemType)ElemType data[MaxSize]; //静态数组存放队列中元素int front,rear;               //队头指针和队尾指针
}SqQueue;                void testQueue(){SqQueue Q;  //声明一个队列(顺序存储)//……后续操作……
}

 

  • 基本操作

    • 创(初始化)

      #define MaxSize 10       //定义队列中元素的最大个数
      typedef struct{ElemType data[MaxSize] //静态数组存放队列中元素int front,rear;               //队头指针和队尾指针
      }SqQueue;                //初始化队列
      void InitQueue(SqQueue &Q){//初始时 队头、队尾指针指向0Q.rear = Q.front = 0;
      }void testQueue(){    //声明一个队列(顺序存储)SqQueue Q;  InitQueue(Q);//……后续操作……
      }//判断队列是否为空
      bool QueueEmpty(SqQueue Q){if(Q.rear==Q.front)  //对空条件return true;elsereturn false;
      }
      
    • 增(入队)只能从队尾入队

      #define MaxSize 10       //定义队列中元素的最大个数
      typedef struct{ElemType data[MaxSize] //静态数组存放队列中元素int front,rear;               //队头指针和队尾指针
      }SqQueue;                //判断队列是否为空
      bool QueueEmpty(SqQueue Q){if(Q.rear==Q.front)  //对空条件return true;elsereturn false;
      }//入队
      bool EnEmpty(SqQueue &Q,ElemType x){if((Q.rear+1)%MaxSize==Q.front)  return false;  //队满则报错Q.data[Q.rear] = x;//将新元素插入队尾Q.rear = (Q.rear + 1)%MaxSize;//队尾指针加1取模return true;
      }
      

      {0,1,2,……,MaxSize-1}将存储空间在逻辑上变成了“环状”——循环队列

      队列已满的条件:队尾指针的再下一个位置是对头,即(Q.rear+1)%MaxSize==Q.front

    • 💭 队列元素个数:(rear+MaxSize-front)%MaxSize


    • ❔ 不浪费一个存储单元 → 增设一个size数据成员

      #define MaxSize 10       //定义队列中元素的最大个数
      typedef struct{ElemType data[MaxSize] //静态数组存放队列中元素int front,rear;               //队头指针和队尾指针int size;            //队列当前长度
      }SqQueue;   
      

      ❔ 不浪费一个存储单元 → 增设一个tag数据成员

      #define MaxSize 10       //定义队列中元素的最大个数
      typedef struct{ElemType data[MaxSize] //静态数组存放队列中元素int front,rear;               //队头指针和队尾指针int tag;            //最近进行的是删除/插入//每次删除操作成功时,都令tag=0;//每次插入操作成功时,都令tag=1;
      }SqQueue;   
      
    • 删(出队)只能从对头元素出队

      //出队
      bool DeQueue(SqQueue &Q,ElemType &x){if(Q.rear+1==Q.front)  return false;  //队满则报错x = Q.data[Q.front];Q.front = (Q.front + 1)%MaxSize;//队头指针后移return true;
      }
      
    • 查(获取队头元素)

      //获得对头元素的值,用x返回
      bool GetHead(SqQueue Q,ElemType &x){if(Q.rear==Q.front)  return false;  //队空则报错x = Q.data[Q.front];return true;
      }
  • 其他出题方式

    🐻‍❄️ 队尾指针rear指向队尾元素
    入队操作:
Q.rear = (Q.rear + 1)%MaxSize;
Q.data[Q.rear] = x;
 初始化:

        让front指向0的位置;让rear指向n-1的位置

判空:

        (Q.rear+1)%MaxSize=Q.front

判满:

        (Q.rear+1)%MaxSize=Q.front ❌

        方案一:牺牲一个存储单元(头指针再尾指针后两个位置)

        方案二:增加辅助变量(size/tag)

总结:

 

队列链式实现

  • 定义

    typedef struct LinkNode{     //链式队列结点ElemType data;struct LinkNode *next;               
    }LinkNode;                typedef struct{  //链式队列LinkNode *front,*rear;  //队列的队头和队尾指针
    }LinkQueue;

链队列——链式存储实现的队列

  • 带头结点

 

 初始化

typedef struct LinkNode{     ElemType data;struct LinkNode *next;               
}LinkNode;                typedef struct{  LinkNode *front,*rear;  
}LinkQueue;//初始化队列
void InitQueue(LinkQueue &Q){//初始时 front rear都指向头结点Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));Q.front->next=NULL;
}void testLinkQueue(){LinkQueue Q;  //声明一个队列InitQueue(Q);  //初始化队列//……后续操作……
}//判断队列是否为空
bool IsEmpty(LinkQueue Q){if(Q.front == Q.rear)return true;elsereturn false;
}

 

 

 入队

//新元素入队
void EnQueue(LinkQueue &Q,ElemType x){LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));s->data=x;s->next=NULL;Q.rear->next=s; //新结点插入到rear之后Q.rear=s;  //修改表尾指针
}

 出队

//新元素出队
void DeQueue(LinkQueue &Q,ElemType &x){if(Q.front == Q.rear)return false;    //空队LinkNode *p=Q.front->next;x=p->data;        //用变量x返回队头元素Q.front->next=p->next;//修改头结点的next指针if(Q.rear==p)      //此次时最后一个结点出队Q.rear=Q.front;  //修改rear指针free(p);   //释放结点空间return true;
}

 不带头结点

 初始化

//初始化队列
void InitQueue(LinkQueue &Q){//初始时 front rear都指向NULLQ.front=NULL;Q.rear=NULL;
}//判断队列是否为空
bool IsEmpty(LinkQueue Q){if(Q.front == NULL)return true;elsereturn false;
}

 入队

//新元素入队
void EnQueue(LinkQueue &Q,ElemType x){LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));s->data=x;s->next=NULL;//不带头结点的队列,第一个元素入队时需要特别处理if(Q.front ==NULL){  //在空队列中插入第一个元素Q.front = s;    //修改队头队尾指针Q.rear = s;  }else{Q.rear->next=s; //新结点插入到rear之后Q.rear=s;  //修改rear指针}
}

 出队

//新元素出队
void DeQueue(LinkQueue &Q,ElemType &x){if(Q.front ==NULL)return false;    //空队LinkNode *p=Q.front;  //p指向此次出队的结点x=p->data;        //用变量x返回队头元素Q.front=p->next;//修改front指针if(Q.rear==p)      //此次时最后一个结点出队Q.front=NULL;  //front指向NULLQ.rear=NULL;   //rear指向NULLfree(p);   //释放结点空间return true;
}

 🙌 链式存储——一般不对队满,除非内存不足

双端队列

栈:只允许从一端插入和删除的线性表

队列:只允许从一端插入,另一端删除的线性表

双端队列:允许从两端插入、两端删除的线性表

        输入受限的双端队列:只允许一端插入、两端删除的线性表

        输出受限的双端队列:只允许两端插入、一端删除的线性表

  • 考点:判断输出序列合法性

    若数据元素输入序列为1/2/3/4,则哪些输出序列是合法的?哪些是非法的?

    • 合法

      • 1/2/3/4;1/2/4/3;1/3/2/4;1/3/4/2;1/4/3/2;

        2/1/3/4;2/1/4/3;2/3/1/4;2/3/4/1;2/4/3/1;

        3/2/1/4;3/2/4/1;3/4/2/1

        4/3/2/1;

        14种合法出栈序列 

      • 输入受限的双端队列(栈中合法的序列,双端队列中一定也合法)

        在栈中非法在该方法下合法:

        1/4/2/3;2/4/1/3;3/1/2/4;3/1/4/2;3/4/1/2;4/1/2/3;4/1/3/2;4/3/1/2

      • 输出受限的双端队列(栈中合法的序列,双端队列中一定也合法)
        • 在栈中非法在该方法下合法:

          1/4/2/3;2/4/1/3;3/1/2/4;3/1/4/2;3/4/1/2;4/1/2/3;4/2/1/3;4/3/1/2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

页面配置、网络数据请求

1. 页面配置文件的作用 小程序中,每个页面都有自己的 .json 配置文件,用来对当前页面的窗口外观、页面效果等进行配置。 2. 页面配置和全局配置的关系 小程序中, app.json 中的 window 节点,可以全局配置小程序中每个页面的窗口…

网络编程-套接字相关基础知识

1.1. Socket简介 套接字&#xff08;socket&#xff09;是一种通信机制&#xff0c;凭借这种机制&#xff0c; 客户端<->服务器 模型的通信方式既可以在本地设备上进行&#xff0c;也可以跨网络进行。 Socket英文原意是“孔”或者“插座”的意思&#xff0c;在网络编程…

凝聚层次聚类算法详解

一、引言 聚类分析是数据挖掘和机器学习领域中的一种重要技术&#xff0c;用于将相似的对象分组在一起。层次聚类是聚类分析中的一种方法&#xff0c;它通过对数据集进行层次分解来满足特定的条件。在层次聚类中&#xff0c;凝聚层次聚类是一种自底向上的策略&#xff0c;它首…

Java初阶数据结构二叉树实现+练习完整(工程文件后序会进行上传)

i1.二叉树的概念 1.二叉树的定义 &#xff08;1&#xff09;二叉树可以是一个节点的有限集合 &#xff08;2&#xff09;可以为空 &#xff08;3&#xff09;或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成的 &#xff08;4&#xff09;二叉树的每一个节点…

openGauss/MogDB调用C FUNCTION

openGauss/MogDB 调用 C FUNCTION 摘要 之前写过一篇关于postgresql 自定义函数实现&#xff0c;通过 contrib 模块进行扩展的帖子&#xff0c;今天和恩墨工程师进行了一些交流&#xff0c;在 MogDB 中也可以实现同样的功能&#xff0c;原以为需要完整的 openGauss 的源码才能…

突破编程_C++_C++11新特性(function与bind绑定器)

1 可调用对象 C 中的可调用对象&#xff08;Callable Objects&#xff09;是指那些能够被调用执行的对象。这包括了函数、函数对象&#xff08;也叫做仿函数&#xff0c;即重载了 operator() 的类或者结构体&#xff09;、Lambda 表达式以及任何具有 operator() 的成员函数的对…

WPF Command

WPF COMMAND在Windows Presentation Foundation&#xff08;WPF&#xff09;框架中是一个设计模式&#xff0c;主要用于实现用户界面&#xff08;UI&#xff09;元素和业务逻辑之间的松耦合交互。具体来说&#xff0c;它是MVVM&#xff08;Model-View-ViewModel&#xff09;架构…

C语言经典面试题目(十一)

1、如何在C语言中进行动态内存分配的错误处理&#xff1f; 在C语言中进行动态内存分配时&#xff0c;需要注意处理内存分配失败的情况。常见的错误处理方式包括&#xff1a; 使用 malloc、calloc 或 realloc 函数进行内存分配后&#xff0c;检查返回的指针是否为 NULL&#x…

PyTorch学习笔记之基础函数篇(十一)

文章目录 7 元素级别的数学运算7.1 torch.abs() 函数7.2 torch.cos() 函数7.3 torch.acos() 函数7.4 torch.add()函数 7 元素级别的数学运算 7.1 torch.abs() 函数 在PyTorch中&#xff0c;torch.abs 函数用于计算张量中每个元素的绝对值。这个函数会返回一个新的张量&#x…

python爬虫实战——抖音

目录 1、分析主页作品列表标签结构 2、进入作品页前 判断作品是视频作品还是图文作品 3、进入视频作品页面&#xff0c;获取视频 4、进入图文作品页面&#xff0c;获取图片 5、完整参考代码 6、获取全部作品的一种方法 本文主要使用 selenium.webdriver&#xff08;Firef…

Java与Go:Map

Map&#xff08;也可以成为字典&#xff0c;映射表&#xff09;是一种数据结构&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。它是一种抽象的数据类型并且允许通过键来快速查找和访问与之相关联的值。在Java和Go中&#xff0c;Map提供了一种非常方便的方…

文章管理AI在架构设计中的关键作用

随着信息技术的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已逐渐成为各行业的创新引擎。在内容管理领域&#xff0c;文章管理AI的崛起不仅改变了传统的内容生产方式&#xff0c;更在架构设计层面展现出其独特的价值和潜力。本文旨在深入探讨文章管理AI在架构设计…

AJAX学习日记——Day 2

一、Bootstrap 1、功能&#xff1a;不离开当前页面&#xff0c;显示单独内容 2、导入&#xff1a; 1、导入bootstrap.css<link href"https://cdn.jsdelivr.net/npm/bootstrap5.3.0-alpha1/dist/css/bootstrap.min.css" rel"stylesheet" integrity&qu…

手机网络连接性能API接口:查询手机网络连接性能状态

手机在网状态查询服务是一项非常方便的服务&#xff0c;可以帮助我们随时了解一个手机号码的在网状态。不论是查询自己的手机号码&#xff0c;还是查询他人的手机号码&#xff0c;这个服务都可以帮助我们获取准确的信息。今天&#xff0c;我想和大家介绍一个非常好用的手机在网…

力扣100题—持续更新

目录 LC141环形列表(easy)题目描述方法1&#xff1a;快慢指针&#xff08;1&#xff09;思路&#xff08;2&#xff09;python代码&#xff08;3&#xff09;复杂度分析 LC881救生艇&#xff08;medium&#xff09;题目描述方法1&#xff1a;双指针-对撞指针&#xff08;1&…

C++三级2021考题

我家的门牌号 #include<bits/stdc.h> using namespace std; int n,m,sum0; int a[100]; void f(int); int x(int); int main() {int s;cin>>n;for(int i1;true;i){s(1i)*i/2;for(int j1;j<i;j){if(s-2*jn){cout<<j<<i;return 0;}}}return 0; } voi…

柚见第十二期(随机匹配)

随机匹配 目的 为了帮大家更快地发现和自己兴趣相同的朋友 问题 匹配 1 个还是匹配多个&#xff1f; 答&#xff1a;匹配多个&#xff0c;并且按照匹配的相似度从高到低排序 怎么匹配&#xff1f;&#xff08;根据什么匹配&#xff09; 答&#xff1a;标签 tags 还可以根据 us…

分享一下自己总结的7万多字java面试笔记和一些面试视频,简历啥的,已大厂上岸

分享一下自己总结的7万多字java面试笔记和一些面试视频&#xff0c;简历啥的&#xff0c;已大厂上岸 自己总结的面试简历资料&#xff1a;https://pan.quark.cn/s/8b602fe53b58 文章目录 SSMspringspring 的优点&#xff1f;IoC和AOP的理解**Bean 的生命周期****列举一些重要…

20个最佳ChatGPT创业提示

20 Best ChatGPT Prompts for Start-Ups 在初创企业不断变化的生态系统中&#xff0c;利用像 ChatGPT 这样的尖端工具可以成为改变游戏规则的因素。初创企业以其敏捷性和创新性而闻名&#xff0c;总是在寻找提高效率、创造力和竞争力的方法。ChatGPT 凭借其先进的功能&#xf…

leetcode2684--矩阵中移动的最大次数

1. 题意 矩阵中一个位置只能从左上一、左、左下一格子转移而来&#xff0c;且当前值一定大于转移之前的值&#xff1b; 求从第一列开始的最大转移步数。 矩阵中移动的最大次数 2. 题解 思路 由于状态只能从左向右转移&#xff0c;所以同一个位置被搜索到后&#xff0c;第一…