IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 队列的基本操作(C/C++) -> 正文阅读

[C++知识库]队列的基本操作(C/C++)


前言


提示:以下是本篇文章正文内容

一、队列定义

队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表---->先进先出FIFO

允许插入(也称入队,进队)的一端称为队尾
允许删除(出队)的一端称为队头
在这里插入图片描述

二、顺序队列

顺序队列:利用数组实现队列的顺序存储

为了避免当只有一个元素时,队头和队尾重合引起麻烦,使用两个指针front(指向队头元素),rear(指向队尾元素)

假溢出:当元素被插入到数组的中下标的最大的位置上之后,队列的空间空间就用完了,尽管此时数组的低端还有空闲空间,这种现象称为假溢出。

三、循环队列

front(指向队头元素),rear(指向队尾元素),但是会导致队尾没位置但是队首有位置的情况(假溢出):使用队列首尾相接的顺序存储结构,记为循环队列
在这里插入图片描述

如何判断队列是否为空,使用front ==rear,但是队列满时也满足该条件?
在这里插入图片描述
当队列满,保留一个元素空间
1.队列满的条件:(rear+1)%QueueSize == front(rear可能在front右边,也可能在front左侧)
在这里插入图片描述

2.队列长度:(rear-front+QueueSize)%QueueSize
注:QueueSize为队列最大长度

1.循环队列的顺序存储结构

typedef int QElemType; 
typedef struct
{
    QElemType data[MAXSIZE];
    int front; /*头指针*/
    int rear; /*尾指针,若队列不空,指向队列元素的下一个位置*/
}SqQueue;

2.初始化空队列

/*初始化一个空队列*/
Status InitQueue(SqQueue *Q)
{
    Q->front= 0;
    Q->rear=0;
    return OK;
}

3.队列长度

/*返回Q的元素个数,也就是队列的当前长度*/
int QueueLength(SqQueue Q)
{
    return (Q.rear - Q.front+MAXSIZE)%MAXSIZE;
}

4.入队

Status EnQueue(SqQueue *Q,QElemType e) {
    if ((Q->rear + 1) % MAXSIZE == Q->front) /*队列满的判断*/
        return ERROR;
    Q->data[Q->rear] = e;  //将元素e赋值给队尾
    Q->rear = (Q->rear + 1) % MAXSIZE; //rear指针向后移一个位置,在末尾则转到数组头部
}

注:rear指针向后移一个位置:Q->rear = (Q->rear + 1) % MAXSIZE;

5.出队

Status DeQueue(SqQueue *Q,QElemType *e)
{
    if (Q->front == Q->rear)
        return ERROR;
    *e= Q->data[Q->front]; //将队头元素赋值给e
    Q->front=(Q->front+1)%MAXSIZE; //front指针向后移一位置,若到最后转到数组头部
}

注:front指针向后移一位置:Q->front=(Q->front+1)%MAXSIZE;

四、链式队列

队列的链式存储结构,本质上是线性表的单链表,只不过是它只能尾进头出,简称为链队列

队头指针指向链队列的头结点,队尾指针指向终端结点

空队列的时候,front指针和rear指针都指向头结点
在这里插入图片描述
队列的链式存储结构

typedef int QElemType;
typedef struct QNode
{
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct  //队列的链表结构
{
    QueuePtr front,rear; //对头、队尾指针
}LinkQueue;

入队:
在这里插入图片描述

Status EnQueue(LinkQueue *Q,QElemType e)
{
    QueuePtr  s = (QueuePtr) malloc(sizeof(QNode));
    if (!s)  //存储分配失败
        exit(OVERFLOW);
    s->data=e;
    s->next=NULL;
    Q->rear->next=s; //把拥有yuansue新结点s赋值为原队尾结点的后继
    Q->rear=s; //把当前的s设置为队尾结点,rear指向s
    return OK;
}

出队:
在这里插入图片描述

Status DeQueue(LinkQueue *Q,QElemType *e)
{
    QueuePtr p;
    if (Q->front == Q->rear)
        return ERROR;
    p= Q->front->next; //将要删除的队头结点暂存给p
    *e = p->data; // 将要删除的队头结点的值赋值给*e
    Q->front->next = p->next; //将原队头结点后继赋值给头结点后继
    if (Q->rear == p)
        Q->rear = Q->front; //若队头是队尾,则删除后将rear指向头结点(只有头结点和一个元素)
    free(p);
    return OK;
}

总结

提示:这里对文章进行总结:

循环队列与顺序队列的比较:
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-19 11:41:26  更:2021-10-19 11:42:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:45:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码