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

news2025/1/11 14:18:07

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.双端队列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1635899.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据分析与内存计算学习笔记

一、Scala编程初级实践 1.计算级数&#xff1a; 请用脚本的方式编程计算并输出下列级数的前n项之和Sn&#xff0c;直到Sn刚好大于或等于q为止&#xff0c;其中q为大于0的整数&#xff0c;其值通过键盘输入。&#xff08;不使用脚本执行方式可写Java代码转换成Scala代码执行&a…

Apache中如何配置 ws 接口

Apache中如何配置 wss 接口 在Apache中配置WebSockets的支持&#xff0c;你需要使用mod_proxy_wstunnel模块&#xff0c;该模块是Apache的一个代理模块&#xff0c;它允许你代理WebSocket请求。 以下是配置步骤的简要说明和示例&#xff1a; 确保你的Apache服务器安装了mod_…

由于找不到msvcr80.dll,无法继续执行代码的解决方法

在日常使用电脑进行工作或娱乐时&#xff0c;您可能会遇到一个令人困惑的情况&#xff1a;屏幕上突然弹出一个错误提示&#xff0c;明确指出“msvcr80.dll文件丢失”&#xff0c;这个错误通常会导致某些应用程序无法正常运行。那么&#xff0c;当我们遇到这个问题时&#xff0c…

【Go 语言入门专栏】Go 语言的起源与发展

前言 Go 语言是当下最为流行的编程语言之一&#xff0c;大约在 2020、2021 年左右开始于国内盛行&#xff0c;许多大厂很早就将部分 Java 项目迁移到了 Go&#xff0c;足可看出其在性能方面的优越性。 相信各位都知道&#xff0c;在爬虫业务中&#xff0c;并发是一个关键的需…

Amazon云计算AWS之[4]非关系型数据库服务SimpleDB和DynamoDB

文章目录 简介非关系型VS关系数据库SimpleDB域条目属性值SimpleDB的使用 DynamoDBSimpleDB VS DynamoDB 简介 非关系型数据库服务主要用于存储结构化的数据&#xff0c;并为这些数据提供查找、删除等基本的数据库功能。AWS中提供的非关系型数据库主要包括SimpleDB和DynamoDB …

MySQL基础学习(待整理)

MySQL 简介 学习路径 MySQL 安装 卸载预安装的mariadb rpm -qa | grep mariadb rpm -e --nodeps mariadb-libs安装网络工具 yum -y install net-tools yum -y install libaio下载rpm-bundle.tar安装包&#xff0c;并解压&#xff0c;使用rpm进行安装 rpm -ivh \ mysql-communi…

嵌入式全栈开发学习笔记---vim编辑器

目录 进入vim编辑器 Shiftzz退出编辑器 vim的三种模式 命令模式 插入模式 yy复制一行 p粘贴一行 nyy复制多行 dd剪切一行 ndd剪切多行 x删除一个字符 nx删除多个字符 u撤销上一次操作 shiftg从第一行如果快速调到最后一行 gg回到第一行 pagedown & pageup往…

arp欺骗详解

目录 arp攻击原理 arp协议简介 arp攻击原理 arp实验 实验环境 实验步骤 1、使用ipconfig命令查看靶机&#xff08;window10&#xff09;的IP地址为下一步攻击做好准备&#xff0c;这一步是模拟你获取对方IP的过程 2、使用ifconfig查询查看攻击者&#xff08;kali&#x…

Windows如何通过wsl2迅速启动Docker desktop的PHP的Hyperf项目容器?

一、安装WSL 什么是WSL&#xff1f; 官网&#xff1a;什么是WSL&#xff1f; Windows Subsystem for Linux (WSL) 是一个在Windows 10和Windows 11上运行原生Linux二进制可执行文件的兼容性层。 换句话说&#xff0c;WSL让你可以在Windows系统上运行Linux环境&#xff0c;而无需…

【套接字-Socket】学习笔记(更新中)

【套接字-Socket】学习笔记 套接字(Socket)的概念TCP通信流程Socket编程中的细节字节序IP地址转换主机字节序 -> 网络字节序网络字节序 -> 主机字节序 参考资料 套接字(Socket)的概念 TCP/IP网络模型有四层&#xff1a;网络接口层、网络互连层、传输层和应用层。 当应用…

GCB | 陆地生态系统C:N:P化学计量对降水变化的响应

西北农林科技大学水保学院上官周平研究员团队在陆地生态系统C:N:P化学计量对降水变化的响应方面取得新进展&#xff0c;并以“C:N:P stoichiometry of plants, soils, and microorganisms: Response to altered precipitation”为题发表在国际生态环境领域著名期刊Global Chang…

令牌技术详解

1. 问题引出 之前我们讲 Cookie 和 Session 时提到过一个用户登录的场景&#xff1a;当用户登录时&#xff0c;服务器端可以把用户的登录信息存在Session中 并返回给客户端对应的SessionID&#xff0c;客户端会把这个SessionID存在Cookie 中当下次访问该服务器时&#xff0c;…

Ubuntu如何更换 PyTorch 版本

环境&#xff1a; Ubuntu22.04 WLS2 问题描述&#xff1a; Ubuntu如何更换 PyTorch 版本考虑安装一个为 CUDA 11.5 编译的 PyTorch 版本。如何安装旧版本 解决方案&#xff1a; 决定不升级CUDA版本&#xff0c;而是使用一个与CUDA 11.5兼容的PyTorch版本&#xff0c;您可…

Google Test Tutorial

Google Test Tutorial 1. 简介(Introduction) google开发的测试框架 2. 术语(Nomenclature) Test Case&#xff1a;一组相关的测试&#xff0c;GoolgeTest Test Suit: 一些出版物、教科书、包括国际软件测试认证委员会资料使用的术语 GoogleTest在逐渐使用TestSuit代替TestCa…

电商致命问题,抖音小店没有流量怎么办?三个方法解决

哈喽~我是电商月月 昨天有个朋友问我&#xff0c;她在抖音上做网店&#xff0c;图的就是抖音日活量大&#xff0c;有了流量&#xff0c;也就容易出单了&#xff0c;但她遇到了一个尴尬的问题&#xff1a;就是抖音的流量并不是她店铺的流量&#xff0c;她上架的商品没几个人浏览…

「Java开发指南」如何利用MyEclipse启用Spring DSL?(二)

本教程将引导您通过启用Spring DSL和使用Service Spring DSL抽象来引导Spring和Spring代码生成项目&#xff0c;本教程中学习的技能也可以很容易地应用于其他抽象。在本教程中&#xff0c;您将学习如何&#xff1a; 为Spring DSL初始化一个项目创建一个模型包创建一个服务和操…

【深度学习基础(1)】什么是深度学习,深度学习与机器学习的区别、深度学习基本原理,深度学习的进展和未来

文章目录 一. 深度学习概念二. 深度学习与机器学习的区别三. 理解深度学习的工作原理1. 每层的转换进行权重参数化2. 怎么衡量神经网络的质量3. 怎么减小损失值 四. 深度学习已取得的进展五. 人工智能的未来 - 不要太过焦虑跟不上 一. 深度学习概念 先放一张图来理解下人工智能…

不同路径 1 2

class Solution {public int uniquePaths(int m, int n) {int[][] dpnew int[m][n];//记录到每个格子有多少种路径for(int i0;i<m;i) dp[i][0]1;for(int j0;j<n;j) dp[0][j]1;//初始化for(int i1;i<m;i){for(int j1;j<n;j){dp[i][j]dp[i-1][j]dp[i][j-1];}}return …

【IR 论文】HyDE:让 LLM 对 query 做查询改写来改进 Dense Retrieval

论文&#xff1a;Precise Zero-Shot Dense Retrieval without Relevance Labels ⭐⭐⭐⭐ CMU, ACL 2023, arXiv:2212.10496 Code: github.com/texttron/hyde 文章目录 论文速读总结 论文速读 在以往的 dense retrieval 思路中&#xff0c;需要对 input query 做 encode 来得到…

Spring6 当中 Bean 的生命周期的详细解析:有五步,有七步,有十步

1. Spring6 当中 Bean 的生命周期的详细解析&#xff1a;有五步&#xff0c;有七步&#xff0c;有十步 文章目录 1. Spring6 当中 Bean 的生命周期的详细解析&#xff1a;有五步&#xff0c;有七步&#xff0c;有十步每博一文案1.1 什么是 Bean 的生命周期1.2 Bean 的生命周期 …