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++版队列总结

请添加图片描述
队列
定义,也是一种操作受限的线性表,只允许在表的一端进行插入,而在另一端进行删除。
基本操作
InitQueue(&Q);初始化
QueueEmpty(Q);队列是否为空
EnQueue(&Q, x);若队列未满,入队
DeQueue(&Q, &x);若队列非空,出队
GetHead(Q, &x);读取队头元素,若队列非空,将队头元素赋值给x
ClearQueue(&Q);清空队列,并回收内存

队列的顺序存储结构

#include<cstdio>

#define MaxSize 50
typedef struct{
    int data[MaxSize];
    int front,rear;
} SqQueue;

void InitQueue(SqQueue &Q)//初始化
{
    Q.front = Q.rear = 0;
}
bool QueueEmpty(SqQueue Q)//队列是否为空
{
    if(Q.front == Q.rear)
        return true;//空为真,非空为假
    return false;
}
bool EnQueue(SqQueue &Q, int x)//若队列未满,入队
{
    //if(Q.rear == MaxSize) return false;//判断条件错误,可能假溢出
    Q.data[Q.rear++] = x;
    return true;
}
bool DeQueue(SqQueue &Q, int &x)//若队列非空,出队
{
    if(Q.front == Q.rear)
        return false;
    x = Q.data[Q.front++];
    return true;
}
bool GetHead(SqQueue Q, int &x)//读取队头元素,若队列非空,将队头元素赋值给x
{
    if(Q.front == Q.rear)
        return false;
    x = Q.data[Q.front];
    return true;
}
void ClearQueue(SqQueue &Q)//清空队列,并回收内存
{
    Q.front = Q.rear = 0;
}
int main()
{
    SqQueue Q;
    InitQueue(Q);
    for(int i = 0; i < 10; i++){
        if(EnQueue(Q, i)){
            int x;
            GetHead(Q, x);
        }
    }
    while(!QueueEmpty(Q))
    {
        int x;
        GetHead(Q, x);
        printf("当前队头元素是%d\n", x);
        DeQueue(Q, x);
        printf("出队的元素是%d\n", x);
    }
    ClearQueue(Q);
    return 0;
}

??超级重点
循环队列的l顺序存储结构
为了解决当队尾追上队头时判满和判空时的矛盾有三种方法,分别是

1.牺牲一个存储空间

#include<cstdio>

#define MaxSize 10
/*顺序循环队列出现队尾追上队首的情况
方法一,牺牲一个存储空间
初始为Q.front == Q.rear,队满为(Q.rear + 1)%MaxSize == Q.front*/
typedef struct{
    int data[MaxSize];
    int front,rear;
} SqQueue;

void InitQueue(SqQueue &Q)//初始化
{
    Q.front = Q.rear = 0;
}
bool QueueEmpty(SqQueue Q)//队列是否为空
{
    if(Q.front == Q.rear)
        return true;//空为真,非空为假
    return false;
}
bool EnQueue(SqQueue &Q, int x)//若队列未满,入队
{
    if((Q.rear + 1)%MaxSize == Q.front) return false;//队列满
    Q.data[Q.rear] = x;
    Q.rear = (Q.rear + 1) % MaxSize;
    return true;
}
bool DeQueue(SqQueue &Q, int &x)//若队列非空,出队
{
    if(Q.front == Q.rear)
        return false;
    x = Q.data[Q.front];
    Q.front = (Q.front + 1) % MaxSize;
    return true;
}
bool GetHead(SqQueue Q, int &x)//读取队头元素,若队列非空,将队头元素赋值给x
{
    if(Q.front == Q.rear)
        return false;
    x = Q.data[Q.front];
    return true;
}
int Length(SqQueue Q){
    return (Q.rear - Q.front + MaxSize) % MaxSize;
}
void ClearQueue(SqQueue &Q)//清空队列,并回收内存
{
    Q.front = Q.rear = 0;
}
int main()
{
    SqQueue Q;
    InitQueue(Q);
    for(int i = 0; i < 15; i++){
        if(EnQueue(Q, i)){
            int x;
            GetHead(Q, x);
        }
        else
            printf("%d入队失败\n", i);
    }
    while(!QueueEmpty(Q))
    {
        int x;
        GetHead(Q, x);
        printf("当前队头元素是%d\n", x);
        DeQueue(Q, x);
        printf("出队的元素是%d\n", x);
    }
    ClearQueue(Q);
    return 0;
}

2.初始为Q.front = Q.rear = Q.size = 0,队满为Q.size == MaxSize

#include<cstdio>
#include<cstring>
#define MaxSize 10
/*顺序循环队列出现队尾追上队首的情况
方法二
初始为Q.front = Q.rear = Q.size = 0,队满为Q.size == MaxSize*/
typedef struct{
    int data[MaxSize];
    int front,rear;
    int size;
} SqQueue;

void InitQueue(SqQueue &Q)//初始化
{
    memset(Q.data, 0, sizeof(Q.data));
    Q.front = Q.rear = Q.size = 0;
}
bool QueueEmpty(SqQueue Q)//队列是否为空
{
    if(Q.size == 0)
        return true;//空为真,非空为假
    return false;
}
bool EnQueue(SqQueue &Q, int x)//若队列未满,入队
{
    if(Q.size == MaxSize) return false;//队列满
    Q.data[Q.rear] = x;
    Q.size++;
    Q.rear = (Q.rear + 1) % MaxSize;
    return true;
}
bool DeQueue(SqQueue &Q, int &x)//若队列非空,出队
{
    if(Q.size == 0)
        return false;
    x = Q.data[Q.front];
    Q.front = (Q.front + 1) % MaxSize;
    Q.size--;
    return true;
}
bool GetHead(SqQueue Q, int &x)//读取队头元素,若队列非空,将队头元素赋值给x
{
    if(Q.size == 0)
        return false;
    x = Q.data[Q.front];
    return true;
}
int Length(SqQueue Q){
    return Q.size;
}
void ClearQueue(SqQueue &Q)//清空队列,并回收内存
{
    Q.front = Q.rear = 0;
}
int main()
{
    SqQueue Q;
    InitQueue(Q);
    for(int i = 0; i < 15; i++){
        if(EnQueue(Q, i)){
            int x;
            GetHead(Q, x);
        }
        else
            printf("%d入队失败\n", i);
    }
    while(!QueueEmpty(Q))
    {
        int x;
        GetHead(Q, x);
        printf("当前队头元素是%d\n", x);
        DeQueue(Q, x);
        printf("出队的元素是%d\n", x);
    }
    ClearQueue(Q);
    return 0;
}

3.
初始为Q.front = Q.rear = 0,tag = false
当Q.front == Q.rear时,tag == false 为队列插入导致队满
tag == true 为队列删除导致队空

#include<cstdio>
#include<cstring>
#define MaxSize 10
/*顺序循环队列出现队尾追上队首的情况
方法三
初始为Q.front = Q.rear = 0,tag = false
当Q.front == Q.rear时,tag == false 为队列插入导致队满
tag == true 为队列删除导致队空*/
typedef struct{
    int data[MaxSize];
    int front,rear;
    bool tag;
} SqQueue;

void InitQueue(SqQueue &Q)//初始化
{
    memset(Q.data, 0, sizeof(Q.data));
    Q.front = Q.rear = 0;
    Q.tag = false;
}
bool QueueEmpty(SqQueue Q)//队列是否为空
{
    if(Q.front == Q.rear && Q.tag == false)
        return true;//空为真,非空为假
    return false;
}
bool EnQueue(SqQueue &Q, int x)//若队列未满,入队
{
    if(Q.front == Q.rear && Q.tag == true) return false;//队列满
    Q.data[Q.rear] = x;
    Q.rear = (Q.rear + 1)%MaxSize;
    Q.tag = true; //可能队满
    return true;
}
bool DeQueue(SqQueue &Q, int &x)//若队列非空,出队
{
    if(Q.front == Q.rear && Q.tag == false)
        return false;
    x = Q.data[Q.front];
    Q.front = (Q.front + 1)%MaxSize;
    Q.tag = false; //可能队空
    return true;
}
bool GetHead(SqQueue Q, int &x)//读取队头元素,若队列非空,将队头元素赋值给x
{
    if(Q.front == Q.rear && Q.tag == false)
        return false;
    x = Q.data[Q.front];
    return true;
}
int Length(SqQueue Q){
    return (Q.rear - Q.front + MaxSize) % MaxSize;
}
void ClearQueue(SqQueue &Q)//清空队列,并回收内存
{
    memset(Q.data, 0, sizeof(Q.data));
    Q.front = Q.rear = 0;
    Q.tag = false;
}
int main()
{
    SqQueue Q;
    InitQueue(Q);
    for(int i = 0; i < 15; i++){
        if(EnQueue(Q, i)){
            int x;
            GetHead(Q, x);
        }
        else
            printf("%d入队失败\n", i);
    }
    while(!QueueEmpty(Q))
    {
        int x;
        GetHead(Q, x);
        printf("当前队头元素是%d\n", x);
        DeQueue(Q, x);
        printf("出队的元素是%d\n", x);
    }
    ClearQueue(Q);
    return 0;
}

队列的链式存储结构

#include <cstdio>
#include <cstdlib>
typedef struct LinkNode{
    int data;
    struct LinkNode *next;
}LinkNode;
typedef struct{
    LinkNode *front, *rear;
}LinkQueue;

/*初始化为带头结点的链式队列*/
void InitQueue(LinkQueue &Q)//初始化
{
     Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
     Q.front->next = NULL;//也即 Q.rear->next =NULL
}
bool QueueEmpty(LinkQueue Q)//队列是否为空
{
    if(Q.front == Q.rear)
        return true;//空为真,非空为假
    return false;
}
bool EnQueue(LinkQueue &Q, int x)//若队列未满,入队
{
    LinkNode *p = (LinkNode*)malloc(sizeof(LinkNode));
    p->data = x;
    p->next=NULL;

       Q.rear->next = p;
    Q.rear = p;
    return true;
}
bool DeQueue(LinkQueue &Q, int &x)//若队列非空,出队
{
    if(Q.front == Q.rear)
        return false;
    LinkNode *p = Q.front->next;
    x = p->data;
    Q.front->next = p->next;
    if(p == Q.rear)
        Q.rear = Q.front;//原队列中只有一个结点,删除后变空
    free(p);
    return true;
}
bool GetHead(LinkQueue Q, int &x)//读取队头元素,若队列非空,将队头元素赋值给x
{
    if(Q.front == Q.rear)
        return false;
    x = Q.front->next->data;
    return true;
}
int Length(LinkQueue Q){
    LinkNode *p = Q.front->next;//带有头结点的形式统一
    int cnt = 0;
    while(p != NULL){
        cnt++;
        p = p->next;
    }
    return cnt;
}
void ClearQueue(LinkQueue &Q)//清空队列,并回收内存
{
    LinkNode *p = Q.front->next;//带有头结点的形式统一
    while(p != NULL){
        LinkNode *tmp = p;
        p = p->next;
        free(tmp);
    }
    Q.front->next = Q.rear->next = NULL;
}
int main()
{
    LinkQueue Q;
    InitQueue(Q);
    for(int i = 0; i < 10; i++){
        if(EnQueue(Q, i)){
            printf("%d入队成功\n", Q.rear->data);
        }
        else
            printf("%d入队失败\n", i);
    }
    printf("入队后队列中元素的个数是%d\n", Length(Q));
    while(!QueueEmpty(Q)){
        int x;
        GetHead(Q, x);
        printf("当前队首元素%d\n", x);
        DeQueue(Q, x);
        printf("出队元素是%d\n", x);
    }
    ClearQueue(Q);
    printf("清空后队列中元素的个数是%d\n", Length(Q));
    return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-15 15:39:53  更:2021-11-15 15:41:00 
 
开发: 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 6:47:41-

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