数据结构——队列

简介: 1、什么是队列2、队列的基本结构3、顺式队列的实现和基本操作4、循环队列的实现和基本操作5、链式队列的实现和基本操作

1.队列的定义

​ 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列储存的图像表示:

数据结构——队列图1.png

2、队列的基本运算

​ 1)初始化队列:Init_Queue(q) ,初始条件:队q 不存在。操作结果:构造了一个空队;

​ 2)入队操作: In_Queue(q,x),初始条件: 队q 存在。操作结果: 对已存在的队列q,插入一个元素x 到队尾,队发生变化;

​ 3)出队操作: Out_Queue(q,x),初始条件: 队q 存在且非空,操作结果: 删除队首元素,并返回其值,队发生变化;

​ 4)读队头元素:Front_Queue(q,x),初始条件: 队q 存在且非空,操作结果: 读队头元素,并返回其值,队不变;

​ 5)判队空操作:Empty_Queue(q),初始条件: 队q 存在,操作结果: 若q 为空队则返回为1,否则返回为0。

3、队列的顺式储存实现

​ 建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置

顺式储存的图示:

数据结构——队列图2.png

(图片来源于百度:https://baike.baidu.com/pic/%E9%98%9F%E5%88%97/14580481/0/cdbf6c81800a19d8116a4d8030fa828ba71e46ce?fr=lemma&ct=single#aid=0&pic=cdbf6c81800a19d8116a4d8030fa828ba71e46ce

顺式队列的存储实现

#include <iostream>
#define MAXSIZE 100        //定义最大元素个数 
#define ElemType int        //定义数据类型 
#define ERROR 0
#define TRUE 1 
#define OVERFLOW -1

using namespace std;

typedef struct QNode *Queue;
struct QNode{
    ElemType Data[MAXSIZE];
    int rear;        //数组下标,表示最后一项
    int front;        //数组下标,表示第一项
};

相信你学到队列时,对顺序表的插入和删除已经很熟练了,在这里就不再赘述,重点在于下面的循环队列!!!(如果不熟练可以看我另外的内容->本博主.其他文章)

循环队列的储存实现

循环队列的储存图示:

数据结构——队列图3.png

(图片来源于百度:https://baike.baidu.com/pic/%E5%BE%AA%E7%8E%AF%E9%98%9F%E5%88%97/3685773/1/5d6034a85edf8db1ee973ff60a23dd54574e74e2?fr=lemma#aid=1&pic=5d6034a85edf8db1ee973ff60a23dd54574e74e2

循环队列的插入

void AddQueue(Queue Ptrq, ElemType X){
    if((Ptrq->rear+1)%MAXSIZE == Ptrq->front)        //用取余判断的是否队列已满
        cout << "Data overflow";
    Ptrq->rear = (Ptrq->rear+1)%MAXSIZE;
    //关于这里为什么要%MAXSIZE,这是循环的关键
    //如果后面add满了,会从前面空出的位置继续添加
    //此时rear所指向的数组下标应该为前面空出位置的下标
    //故%MAXSIZE
    
    Ptrq->Data[Ptrq->rear] = X;        //插入元素X
}

循环队列的删除

ElemType DeleteQueue(Queue Ptrq){
    if(Ptrq->front == Ptrq->rear){        //判断是否为空队列
        cout << "No data";
        return ERROR;
    }
    else{
        Ptrq->front = (Ptrq->front+1)%MAXSIZE;
        return Ptrq->Data[Ptrq->front];        //出列表
    }
}

4、队列的链式储存实现

​ 队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列。为了操作上的方便,我们将队头指针指向链队列的头节点,而队尾指针指向终端节点。空队列时,front和rear都指向头节点。

链式队列的图示:
数据结构——队列图4.png

(图片来源于百度:https://baike.baidu.com/pic/%E9%98%9F%E5%88%97/14580481/0/7dd98d1001e939015d4345bb78ec54e737d196f6?fr=lemma&ct=single#aid=0&pic=7dd98d1001e939015d4345bb78ec54e737d196f6

链式队列的储存实现

#include <iostream>
#define MAXSIZE 100        //定义最大元素个数 
#define ElemType int        //定义数据类型 
#define ERROR 0
#define TRUE 1 
#define OVERFLOW -1

using namespace std;

typedef struct QNode *Queue;
struct QNode{
    ElemType Data;
    Queue Next;
};

链式队列的删除

ElementType DeleteQueue (Queue PtrQ ){
    Queue FrontCell;
    ElementType FrontElem;
    if (PtrQ->front == nullptr){        //判断是否为空队列
        cout << "No data";
        return ERROR;
    }
    FrontCell = PtrQ->front;
    if ( PtrQ->front == PtrQ->rear)        //如果队列只有一个元素 
        PtrQ->front = PtrQ->rear = nullptr;        //删除后队列置为空
    else
        PtrQ->front = PtrQ->front->Next;
    FrontElem = FrontCell->Data;
    free(FrontCell);        //释放被删除结点空间
    return FrontElem;
}
相关文章
|
2月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
230 9
|
3月前
|
缓存 算法 调度
数据结构之 - 双端队列数据结构详解: 从基础到实现
数据结构之 - 双端队列数据结构详解: 从基础到实现
106 5
|
3月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
126 64
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
68 5
|
2月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
3月前
初步认识栈和队列
初步认识栈和队列
65 10
|
3月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
30 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
3月前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
37 2
【数据结构】--- 栈和队列
【数据结构】--- 栈和队列
|
3月前
|
消息中间件 存储 Java
数据结构之 - 深入探析队列数据结构: 助你理解其原理与应用
数据结构之 - 深入探析队列数据结构: 助你理解其原理与应用
53 4