数据结构——队列练习题

news2024/12/27 11:14:57

在C语言中,.和->运算符用于访问结构体的成员变量。它们之间的区别在于:.运算符用于访问结构体变量的成员。->运算符用于访问结构体指针变量的成员

1a(rear指向队尾元素后一位,判空判满时牺牲一个存储单元)

首先我们考虑1a的情况下在牺牲一个存储单元rear指向队尾元素后一个位置该怎么实现队列的基本操作,当rear指向队尾元素的后一位时,队列的实现需要牺牲一个存储单元来区分队列是空还是满

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定义队列中元素的最大个数

typedef struct {
    int data[MaxSize]; // 用静态数组存放队列元素
    int front, rear; // 队头指针和队尾指针
} SqQueue;

// 初始化队列
void InitQueue(SqQueue* Q) {
    Q->front = Q->rear = 0; // 初始时队头、队尾指针指向0
}

// 判断队列是否为空
bool QueueEmpty(SqQueue* Q) {
    return Q->front == Q->rear; // 判空条件:队头指针等于队尾指针
}

// 判断队列是否已满
bool QueueFull(SqQueue* Q) {
    return (Q->rear + 1) % MaxSize == Q->front; // 判满条件:队尾指针后移一位后等于队头指针
}

// 入队
bool EnQueue(SqQueue* Q, int x) {
    if (QueueFull(Q)) { // 判断队满
        return false; // 队满报错
    } else {
        Q->data[Q->rear] = x; // 新元素插入队尾
        Q->rear = (Q->rear + 1) % MaxSize; // 队尾指针后移
        return true;
    }
}

// 出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {
    if (QueueEmpty(Q)) { // 判断队空
        return false; // 队空则报错
    } else {
        Q->front = (Q->front + 1) % MaxSize; // 队头指针后移
        *x = Q->data[Q->front]; // 获取队头元素
        return true;
    }
}

// 获得队头元素的值,用x返回
bool GetHead(SqQueue* Q, int* x) {
    if (QueueEmpty(Q)) { // 判断队空
        return false; // 队空则报错
    } else {
        *x = Q->data[Q->front]; // 获取队头元素
        return true;
    }
}

在这个实现中,队列满的条件是队尾指针后移一位后等于队头指针。这意味着队列的实际容量是MaxSize - 1,因为一个存储单元被用来区分队列是空还是满。 

2a(rear指向队尾元素,判空判满时牺牲一个存储单元)

当rear指向队尾元素时,队列的实现不需要牺牲额外的存储单元来区分队列是空还是满。在这种情况下,队列的实际容量就是MaxSize,因为所有的存储单元都可以用来存储元素。

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定义队列中元素的最大个数

typedef struct {
    int data[MaxSize]; // 用静态数组存放队列元素
    int front, rear; // 队头指针和队尾指针
} SqQueue;

// 初始化队列
void InitQueue(SqQueue* Q) {
    // 初始时队头指针指向0
    // 队尾指针指向数组尾元素
    Q->front = 0;
    Q->rear = MaxSize - 1;
}

// 判断队列是否为空
bool QueueEmpty(SqQueue* Q) {
    if (Q->rear == Q->front) { // 判空条件
        return true;
    } else {
        return false;
    }
}

// 判断队列是否已满
bool QueueFull(SqQueue* Q) {
    if ((Q->rear + 1) % MaxSize == Q->front) { // 判满条件
        return true;
    } else {
        return false;
    }
}

// 入队
bool EnQueue(SqQueue* Q, int x) {
    if (QueueFull(Q)) { // 判断队满
        return false; // 队满报错
    } else {
        Q->rear = (Q->rear + 1) % MaxSize; // 队尾指针后移
        Q->data[Q->rear] = x; // 新元素插入队尾
        return true;
    }
}

// 出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {
    if (QueueEmpty(Q)) { // 判断队空
        return false; // 队空则报错
    } else {
        Q->front = (Q->front + 1) % MaxSize; // 队头指针后移
        *x = Q->data[Q->front]; // 获取队头元素
        return true;
    }
}

// 获得队头元素的值,用x返回
bool GetHead(SqQueue* Q, int* x) {
    if (QueueEmpty(Q)) { // 判断队空
        return false; // 队空则报错
    } else {
        *x = Q->data[(Q->front + 1) % MaxSize]; // 获取队头元素
        return true;
    }
}

在这个实现中,队列满的条件是队尾指针后移一位后等于队头指针。这意味着队列的实际容量是MaxSize,因为所有的存储单元都可以用来存储元素 ,与1a的相比主要改变了入队初始化的操作,入队的时候,rear需要先往后一位,再接受新的数据。

1b(rear指向队尾元素后一位,增加size变量记录长度)

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定义队列中元素的最大个数

typedef struct {
    int data[MaxSize]; // 用静态数组存放队列元素
    int front, rear; // 队头指针和队尾指针
    int size;//增加一个size记录队列的长度
} SqQueue;

// 初始化队列
void InitQueue(SqQueue* Q) {
    // 初始时队头、队尾指针指向0
    Q->rear = Q->front = 0;
    Q->size = 0;
}

// 判断队列是否为空
bool QueueEmpty(SqQueue Q) {
    if (Q->size == 0) { // 判空条件
        return true;
    }
    else {
        return false;
    }

bool QueueFull(SqQueue Q) {
    if (Q->size==MaxSize) { // 判满条件
        return true;
    }
    else {
        return false;
    }
}

// 入队
bool EnQueue(SqQueue* Q, int x) {
    if (QueueFull(*Q)) { // 判断队满
        return false; // 队满报错
    }
    else {
        Q->data[Q->rear] = x; // 新元素插入队尾
        Q->rear = (Q->rear + 1) % MaxSize; // 队尾指针加1取模,队尾指针后移
        Q->size = Q->size + 1; // 队列长度加1
        return true;
    }
}

// 出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {
    if (QueueEmpty(*Q)) { // 判断队空
        return false; // 队空则报错
    }
    else {
        *x = Q->data[Q->front];
        Q->front = (Q->front + 1) % MaxSize; // 队头指针后移
        Q->size = Q->size - 1; // 队列长度减1
        return true;
    }
}
// 获得队头元素的值,用x返回
bool GetHead(SqQueue Q, int* x) {
    if (QueueEmpty(*Q)) { // 判断队空
        return false; // 队空则报错
    }
    else {
        *x = Q.data[Q.front];
        return true;
    }
}

2b(rear指向队尾元素,增加size变量记录长度)

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定义队列中元素的最大个数

typedef struct {
    int data[MaxSize]; // 用静态数组存放队列元素
    int front, rear; // 队头指针和队尾指针
    int size;//增加一个size记录队列的长度
} SqQueue;

// 初始化队列
void InitQueue(SqQueue* Q) {
    // 初始时队头、队尾指针指向
    Q->front = 0;
    Q->rear = MaxSize - 1;
    Q->size = 0;
}

// 判断队列是否为空
bool QueueEmpty(SqQueue Q) {
    if (Q->size == 0) { // 判空条件
        return true;
    }
    else {
        return false;
    }

bool QueueFull(SqQueue Q) {
    if (Q->size==MaxSize) { // 判满条件
        return true;
    }
    else {
        return false;
    }
}

// 入队
bool EnQueue(SqQueue* Q, int x) {
    if (QueueFull(*Q)) { // 判断队满
        return false; // 队满报错
    }
    else {
        Q->rear = (Q->rear + 1) % MaxSize; // 队尾指针加1取模,队尾指针后移
        Q->data[Q->rear] = x; // 新元素插入队尾
        Q->size = Q->size + 1; // 队列长度加1
        return true;
    }
}

// 出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {
    if (QueueEmpty(*Q)) { // 判断队空
        return false; // 队空则报错
    }
    else {
        *x = Q->data[Q->front];
        Q->front = (Q->front + 1) % MaxSize; // 队头指针后移
        Q->size = Q->size - 1; // 队列长度减1
        return true;
    }
}
// 获得队头元素的值,用x返回
bool GetHead(SqQueue Q, int* x) {
    if (QueueEmpty(*Q)) { // 判断队空
        return false; // 队空则报错
    }
    else {
        *x = Q.data[Q.front];
        return true;
    }
}

3a(rear指向队尾元素后一位,判空判满时添加一个tag标签标记)

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定义队列中元素的最大个数

typedef struct {
    int data[MaxSize]; // 用静态数组存放队列元素
    int front, rear; // 队头指针和队尾指针
    int tag;//tag标签用于标记,0=出队,1=入队
} SqQueue;

// 初始化队列
void InitQueue(SqQueue* Q) {
    Q->front = Q->rear = 0; // 初始时队头、队尾指针指向0
    Q->tag = 0;
}

// 判断队列是否为空
bool QueueEmpty(SqQueue* Q) {
    return (Q->front == Q->rear&&Q->tag==0); // 判空条件:队头指针等于队尾指针
}

// 判断队列是否已满
bool QueueFull(SqQueue* Q) {
    return ((Q->rear + 1) % MaxSize == Q->front&&Q->tag==1); // 判满条件:队尾指针后移一位后等于队头指针
}

// 入队
bool EnQueue(SqQueue* Q, int x) {
    if (QueueFull(Q)) { // 判断队满
        return false; // 队满报错
    }
    else {
        Q->data[Q->rear] = x; // 新元素插入队尾
        Q->rear = (Q->rear + 1) % MaxSize; // 队尾指针后移
        Q->tag = 1;//入队后tag变为1;
        return true;
    }
}

// 出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {
    if (QueueEmpty(Q)) { // 判断队空
        return false; // 队空则报错
    }
    else {
        Q->front = (Q->front + 1) % MaxSize; // 队头指针后移
        *x = Q->data[Q->front]; // 获取队头元素
        Q->tag = 1;//出队后tag变为1;
        return true;
    }
}

// 获得队头元素的值,用x返回
bool GetHead(SqQueue* Q, int* x) {
    if (QueueEmpty(Q)) { // 判断队空
        return false; // 队空则报错
    }
    else {
        *x = Q->data[Q->front]; // 获取队头元素
        return true;
    }
}

3b(rear指向队尾元素,判空判满时添加一个tag标签标记)

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定义队列中元素的最大个数

typedef struct {
    int data[MaxSize]; // 用静态数组存放队列元素
    int front, rear; // 队头指针和队尾指针
    int tag;//tag标签用于标记,0=出队,1=入队
} SqQueue;

// 初始化队列
void InitQueue(SqQueue* Q) {
    Q->front = 0//初始时队头指针指向队头元素
    Q->rear = MaxSize-1;//初始时队尾指针指向队尾元素
    Q->tag = 0;
}

// 判断队列是否为空
bool QueueEmpty(SqQueue* Q) {
    return (Q->front == Q->rear && Q->tag == 0); // 判空条件:队头指针等于队尾指针
}

// 判断队列是否已满
bool QueueFull(SqQueue* Q) {
    return ((Q->rear + 1) % MaxSize == Q->front && Q->tag == 1); // 判满条件:队尾指针后移一位后等于队头指针
}

// 入队
bool EnQueue(SqQueue* Q, int x) {
    if (QueueFull(Q)) { // 判断队满
        return false; // 队满报错
    }
    else {
        Q->rear = (Q->rear + 1) % MaxSize; // 队尾指针后移
        Q->data[Q->rear] = x; // 新元素插入队尾
        Q->tag = 1;//入队后tag变为1;
        return true;
    }
}

// 出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {
    if (QueueEmpty(Q)) { // 判断队空
        return false; // 队空则报错
    }
    else {
        Q->front = (Q->front + 1) % MaxSize; // 队头指针后移
        *x = Q->data[Q->front]; // 获取队头元素
        Q->tag = 1;//出队后tag变为1;
        return true;
    }
}

// 获得队头元素的值,用x返回
bool GetHead(SqQueue* Q, int* x) {
    if (QueueEmpty(Q)) { // 判断队空
        return false; // 队空则报错
    }
    else {
        *x = Q->data[Q->front]; // 获取队头元素
        return true;
    }
}

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

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

相关文章

Linux系统安装青龙面板结合内网穿透实现使用公网地址远程访问

文章目录 前言一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用。本教程使用Docker部署青龙&#xff0c;如何安装Docker详见&#xff1a; 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 …

ASP.NET Core 使用Log4net

1. Nuget安装log4net&#xff0c;图里的两个 2.项目根目录下添加log4net.config.添加下面的代码: <?xml version"1.0" encoding"utf-8"?> <configuration><!-- This section contains the log4net configuration settings --><log…

若依 Vue 前端分离 3.8.8 版中生成的前端代码中关于下拉框只有下拉箭头的问题

生成代码修改前 <el-form-item label"课程学科" prop"subject"><el-select v-model"queryParams.subject" placeholder"请选择课程学科" clearable><el-optionv-for"dict in course_subject":key"dict…

学会python——用python制作一个绘图板(python实例十九)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.制作一个绘图板 3.1 代码构思 3.2 代码实例 3.3 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可…

并发、多线程和HTTP连接之间有什么关系?

一、并发的概念 并发是系统同时处理多个任务或事件的能力。在计算中&#xff0c;这意味着系统能够在同一时间段内处理多个任务&#xff0c;而不是严格按照顺序一个接一个地执行它们。并发提高了系统的效率和资源利用率&#xff0c;从而更好地满足用户的需求。在现代应用程序中&…

2-3 图像分类数据集

MNIST数据集是图像分类任务中广泛使用的数据集之一&#xff0c;但作为基准数据集过于简单&#xff0c;我们将使用类似但更复杂的Fashion-MNIST数据集。 %matplotlib inline import torch import torchvision # pytorch模型关于计算机视觉模型实现的一个库 from torch.utils i…

Ubuntu24.04LTS基础软件下载

librewolf: deb文件link 作用&#xff1a;访问github&#xff0c;无痕浏览&#xff0c;这个速度&#xff0c;不指望了 vscodium: 从deb安装&#xff0c;ubuntu sudo dpkg -i xxx.debpaste-image 插件替代 markdown wps: libreoffice: 替换USTC源 sudo nano /etc/apt/sourc…

昇思25天学习打卡营第8天|ResNet50迁移学习

一、迁移学习定义 迁移学习&#xff08;Transfer Learning&#xff09;&#xff1a;在一个任务上训练得到的模型包含的知识可以部分或全部地转移到另一个任务上。允许模型将从一个任务中学到的知识应用到另一个相关的任务中。适用于数据稀缺的情况&#xff0c;可减少对大量标记…

【hive】数据采样

参考https://hadoopsters.com/how-random-sampling-in-hive-works-and-how-to-use-it-7cdb975aa8e2&#xff0c;可以直接查看原文&#xff0c;下面只是对原文进行概括和实际性能测试。 1.distribute by sort by2.测试3.map端数据过滤优化采样 在说数据采样之前&#xff0c;需要…

聚集索引与非聚集索引的区别

1.从文件存储方式来区别 聚集索引是指表的索引和数据存储在一个文件中&#xff08;innodb&#xff09; 非聚集索引指表数据与表索引存储在两个文件中&#xff08;MyISAM&#xff09; 2.从文件的检索方式来区别 聚集索引的data存在叶子节点 非聚集索引叶子节点存储的事data的…

三叶青图像识别研究简概

三叶青图像识别研究总概 文章目录 前言一、整体目录介绍二、前期安排三、构建图像分类数据集四、模型训练准备五、迁移学习模型六、在测试集上评估模型精度七、可解释性分析、显著性分析八、图像分类部署九、树莓派部署十、相关补充总结 前言 本系列文章为近期所做项目研究而作…

Java并发编程知识整理笔记

目录 ​1. 什么是线程和进程&#xff1f; 线程与进程有什么区别&#xff1f; 那什么是上下文切换&#xff1f; 进程间怎么通信&#xff1f; 什么是用户线程和守护线程&#xff1f; 2. 并行和并发的区别&#xff1f; 3. 创建线程的几种方式&#xff1f; Runnable接口和C…

基于aardio web.view2库和python playwright包的内嵌浏览器自动化操作

通过cdp协议可以实现playwright操控webview。 新建Python窗口工程 修改pip.aardio 修改pip.aardio&#xff0c;并执行&#xff0c;安装playwright。 //安装模块 import process.python.pip; //process.python.path "python.exe";/* 安装模块。 参数可以用一个字…

深度学习每周学习总结N3(文本分类实战:基本分类(熟悉流程)、textCNN分类(通用模型)、Bert分类(模型进阶))

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结&#xff1a;1. 前期准备环境安装 2. 文本分类基本流程a. 加载数据b.构建词典c.生成数据批次和迭代器d.定义模型及实例e. 定义…

C++ 仿QT信号槽二

// 实现原理 // 每个signal映射到bitset位&#xff0c;全集 // 每个slot做为signal的bitset子集 // signal全集触发&#xff0c;标志位有效 // flip将触发事件队列前置 // slot检测智能指针全集触发的标志位&#xff0c;主动运行子集绑定的函数 // 下一帧对bitset全集进行触发清…

玩转内网穿透详细教程,收藏这一篇就够了

小朋友&#xff0c;你是否有过以下这些烦恼&#xff1f; 当你在外地&#xff0c;苦于无法拿到存储在家里的资料&#xff1b; 当你在玩游戏的时候&#xff0c;苦于无法和朋友直接联机&#xff1b; 当你在家里&#xff0c;苦于无法通过自己的电脑连上公司电脑远程办公&#xf…

论文导读 | 综述:大模型与推荐系统

最近&#xff0c;预训练语言模型&#xff08;PLM&#xff09;在自然语言处理领域取得了巨大成功&#xff0c;并逐渐引入推荐系统领域。本篇推文介绍了最近的两篇预训练语言模型和推荐系统结合的综述&#xff1a; [1] Pre-train, Prompt, and Recommendation: A Comprehensive …

Django学习第五天

启动项目命令 python manage.py runserver 图像验证码生成随机字母或者数字 import random from PIL import Image, ImageDraw, ImageFont, ImageFilterdef check_code(width120, height40, char_length5, font_fileZixunHappyBold.ttf, font_size28):code []img Image.new…

《后端程序猿 · Caffeine 本地缓存》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻一周&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

4、SSD主控

简述 主控是个片上系统&#xff0c;由硬件和固件组成一个功能完整的系统&#xff1b;上文所述的FTL就属于主控的固件范畴。主控闪存构成了整个SSD&#xff0c;在闪存确定的情况下&#xff0c;主控就反映了各家SSD的差异。实时上各家SSD的差异也主要反应在主控上&#xff0c;毕…