(40)4.30数据结构(队列)

2024-05-01 14:52
文章标签 数据结构 队列 40 4.30

本文主要是介绍(40)4.30数据结构(队列),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.队列的基本概念

2.队列的顺序

#define MaxSize 10
#define ElemType int
typedef struct 
{
    ElemType data[MaxSize];
    int front, rear;
}SqQueue;
//1.初始化操作
void InitQueue(SqQueue& Q)
{
    //初始化 队头,队尾指针指向0
    Q.rear = Q.front = 0;
  }
//判断为空
bool QueueEmpty(SqQueue Q)
{
    if (Q.rear = Q.front)  //队空条件
        return true;
    else
        return false;
}
void testQueue()
{
    SqQueue Q;
    InitQueue(Q);
    //..后续操作。。//
}
//2.入队
bool EnQueue(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;
}
//3.出队(删除一个队头元素,并用x返回)
bool DEQueue(SqQueue& Q, ElemType& x)
{
    if (Q.rear == Q.front)
        return false;
    x = Q.data[Q.front];
    Q.front = (Q.front + 1) % MaxSize;
    return true;
}
//获得队头的元素值,用下返回
bool DEQueue(SqQueue& Q, ElemType& x)
{
    if (Q.rear == Q.front)
        return false;   //队空则报错
    x = Q.data[Q.front];
    return true;
}

//队列元素个数:
//(rear+MaxSize-front)%MaxSize
//方案二判断队列已满/已空
typedef struct
{
    ElemType data[MaxSize];
    int front, rear;
    int size;  //初始化时  rear=front=0; size=0;
}SqQueue;
//插入成功size++
//插入失败size--
//方案三判断队列已满/已空
typedef struct
{
    ElemType data[MaxSize];
    int front, rear;
    int tag;//最近进行的是删除/插入
}SqQueue;
//每次删除操作成功时,都令tag=0;
//每次删除操作失败时,都令tag=1;
//只有删除成功才能导致队空;
//只有插入成功才能导致队满;

//队满条件:
//front==rear&&tag==1;
//队空条件
//front==rear&&tag==0;

//其他出题方法
//指向尾指针元素指向的方向


3.队列的链式实现

#include <stdio.h>
#include <stdlib.h>

#define ElemType int

typedef struct LinkNode //链式队列结点
{
    ElemType data;
    struct LinkNode* next;
}LinkNode;

typedef struct         //链式队列
{
    LinkNode* front, * rear;//队列的队头和队尾指针

}LinkQueue;
//1.初始化(带头结点)
void InitQueue(LinkQueue& Q)
{
    //初始化front,rear 都指向头结点
    Q.rear = Q.front = (LinkNode*)malloc(sizeof(LinkNode));
    Q.front->next = NULL;
}

void testLinkQueue()
{
    LinkQueue Q;  //声明一个队列
    InitQueue(Q); //初始化队列
    //。。。后续操作/
}
//判断队列是否为空
bool IsEmpty(LinkQueue Q)
{
    if (Q.rear = Q.front)  //队空条件
        return true;
    else
        return false;
}
//初始化队列(不带头结点)
void InitQueue(LinkQueue& Q)
{
    //初始化 front rear 都指向NULL
    Q.rear = NULL;
    Q.front= NULL;
}
bool IsEmpty(LinkQueue Q)
{
    if (Q.front ==NULL) 
        return true;
    else
        return false;
}
//2.入队(带头结点)
void EnQueue(LinkQueue& Q, ElemType x)
{
    LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
    s->data = x;
    s->next = NULL;
    Q.rear->next = s;
    Q.rear = s;
}
//入队(不带头结点)
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 指针 
    }
}
//出队(带头结点)

bool 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;
}
//队头元素出队(不带头结点)
bool 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.rear = NULL;          //front 指向 NULL
        Q.rear = NULL;          //rear 指向NULL 
    }
    free(p);                    //释放空间 
    return true;
}

4.双端队列

这篇关于(40)4.30数据结构(队列)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/951973

相关文章

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<