队列的定义、基本操作、顺序实现(初始化,入队,出队)

简介: 数据结构:队列的定义、基本操作、顺序实现(初始化,入队,出队)附有代码讲解

1.队列的定义

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

网络异常,图片无法展示
|

  • 入队就是插入操作
  • 出队就是删除操作

特点: 先进先出(FIFO)

重要术语:队头、队尾、空队列

  • 队头:允许删除的一端
  • 队尾:允许插入的一端
  • 空队列:没有任何数据元素

2.队列的基本操作

  • InitQueue(&Q):初始化队列,构造一个空队列Q
  • DestoryQueue(&Q):销毁队列,销毁并释放队列Q所占用的内存空间
  • EnQueue(&Q,x):入队,若队列Q未满,将x加入,使之成为新的队尾
  • DeQueue(&Q,&x):出队,若队列Q非空,删除队头元素,并用x返回
  • GetHead(Q,&x):读对头元素,若队列Q非空,则将队头元素赋值给x

3.队列的顺序实现

用静态数组存放队列元素,在定义一个队头指针,一个队尾指针

#define Maxsize 10
typedef struct{
    ElemType data[MaxSize];
    int front;
    int rear;
}SqQueue;

3.1初始化操作

初始化队列:

void InitQueue(SqQueue &Q){
    Q.rear=Q.front=0;    //初始队头、队尾指针指向0
}

判断队列是否为空:

bool QueueEmpty(SqQueue Q){
    Q.rear==Q.front
        return true
    return false;
}

3.2入队操作

入队操作只能从队尾入队;实现分析:需要先判断队列是否为满,然后将新元素插入队尾,然后修改队尾的指针后移。

bool EnQueue(SqQueue &Q,ElemType x){
    if(队列已经满)
        return false;
    Q.dara[Q.rear]=x;
    Q.rear=Q.rear+1;   
        return true;
}

3.2.1方案一(判空)

如果直接给队尾指针直接后移是会出问题的,当整个静态数组被存满的时候,rear指针就会指向MaxSize,如果依次让对头出队的时候,rear依然是指向MaxSize,所以rear==MaxSize的条件不能判断队列已经满了。所以需要修改为:让队尾指针+1后取模

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

用模运算将储存空间在逻辑上变成了“环状”

网络异常,图片无法展示
|

3.2.2方案二(判空)

用size记录队列的当前长度,初始化size为0。

int size=0;  //初始化时候
size++;   //插入成功
size--;   //删除成功
队列空:size=0;
队列为满:size==MaxSize

3.2.3方案三(判空)

标记位,删除成功的时候tag=0,插入成功的时候tag=1

  • 队列满:front==rear && tag==1
  • 队列空:front==rear && tag==0

3.3出队操作

删除一个队列头元素,并且用x返回

bool DeQueue(SqQueue &Q,ElemType &X){
    if(Q.rear==Q.front)   //判断队列是否为空
        return false;
    x=Q.data[Q.front];
    Q.front=(Q.front+!)%MaxSize;  //队列头指针后移
}

3.4 查队头元素

获得队列头元素值并用x返回

bool GetQueue(SqQueue Q,ElemType &X){
    if(Q.rear==Q.front)   //判断队列是否为空
        return false;
    x=Q.data[Q.front];
    return true;
}
目录
相关文章
|
算法 前端开发 C++
【Qt UI相关】Qt设置窗体或控件的背景色透明
【Qt UI相关】Qt设置窗体或控件的背景色透明
2657 0
|
11月前
|
数据采集 存储 算法
终于有人把数据挖掘讲明白了
在大数据时代,许多企业面临一个难题:数据存储量庞大,却难以从中挖掘真正价值。本文深入探讨了数据挖掘的核心概念与实践方法,解析了其与普通数据分析的区别,并通过真实案例展示了如何通过数据挖掘发现隐藏的业务规律。文章还详细介绍了数据挖掘的六个步骤及三大关键点,强调了业务理解与数据质量的重要性,帮助企业在实际应用中少走弯路,真正实现数据驱动决策。
终于有人把数据挖掘讲明白了
|
机器学习/深度学习 数据建模 定位技术
【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路
【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路
6915 0
【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路
|
移动开发 算法 调度
【贪心算法】一文让你学会“贪心”(贪心算法详解及经典案例)
贪心算法是一种非常常见的算法,它的简单和高效性使其在实际应用中被广泛使用。 贪心算法的核心思想是在每一步都采取当前状态下最优的选择,而不考虑未来可能产生的影响。虽然贪心算法不能保证总是得到最优解,但在很多情况下,它可以获得很好的结果。 本篇文章将介绍贪心算法的基本概念和一些经典应用,以及如何通过贪心算法来解决一些实际问题。希望通过本文的阅读,读者可以对贪心算法有更加深刻的理解,并能够在实际问题中应用贪心算法来得到更好的解决方案。 让我们暴打贪心算法吧!
6970 0
|
11月前
|
存储 安全 测试技术
理解功能需求
本文全面解析软件开发中的功能需求,涵盖定义、分类、实例及编写与管理的最佳实践。内容适用于业务分析师、项目经理和开发人员,助力构建高质量、符合用户期望的软件产品。
968 0
|
C语言 C++ 容器
【数据结构】二叉搜索树(二叉排序树)
本文介绍了二叉搜索树(Binary Search Tree, BST)的定义、实现及其性能分析。二叉搜索树是一种特殊的二叉树,其特点是左子树所有节点值小于根节点值,右子树所有节点值大于根节点值,且每个子树也满足此特性。文中详细讲解了BST的节点结构、插入、查找、删除等操作的实现,并通过C++代码展示了这些功能。此外,还讨论了BST的性能:在理想情况下,时间复杂度接近O(logN),但在最坏情况下可能退化为O(N)。为了提高效率,后续将学习自平衡二叉搜索树如AVL树和红黑树。掌握BST有助于理解STL中的set和map容器。感谢阅读,欢迎点赞支持。
1553 9
|
11月前
|
数据采集 人工智能 数据可视化
打造企业级调度系统的最佳实践---以百度热搜关键词为例
本教程详解如何构建自动化分析百度热搜关键词的系统,涵盖代理IP、多线程、任务调度等核心技术,助你打造高效稳定的数据采集引擎。
484 0
|
传感器 测试技术 芯片
在硬件连接时,如何确定 GPIO 引脚的功能和编号
在硬件连接中,确定GPIO引脚的功能和编号需查阅相关芯片或开发板的官方文档,了解引脚布局图,确认引脚的具体功能和编号,以确保正确连接和编程。
1480 3