数据结构——队列练习题

在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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

react 自定义 年-月-日 组件,单独选择年、月、日,并且产生联动

自定义 年-月-日 组件 code import { useState } from react function Year_Month_Date() {const [yearList, setYearList] useState([])const [monthList, setMonthList] useState([])const [dateList, setDateList] useState([])const [currentYear, setCurrentYear] u…

【React】上传文章封面基础实现

<Form.Item label"封面"><Form.Item name"type"><Radio.Group onChange{onTypeChange}><Radio value{1}>单图</Radio><Radio value{3}>三图</Radio><Radio value{0}>无图</Radio></Radio.Group&…

交叉测试的优点和缺点!

交叉测试在软件测试中具有重要的地位和作用。通过交叉测试&#xff0c;可以提高软件质量、提升用户体验、增加测试覆盖率、提高测试效率以及满足市场需求和竞争优势。因此&#xff0c;在软件开发和测试过程中&#xff0c;应充分重视交叉测试的实施和应用。 以下是对其优缺点的…

matplotlib下载安装

matplotlib下载安装过程同之前写的pygame很类似。 Pygame下载安装 python官网 1.搜索matplotlib 直接点进去 查看历史版本&#xff0c;因为新版本可能出现与python不匹配问题。 我选择3.6.3版本&#xff0c;因为我安装的python是3.8&#xff0c;可以匹配版本。同时window操…

泰迪智能科技企业项目试岗实训——数据分析类型

当今社会&#xff0c;就业技能的瞩目度正与日俱增。在竞争激烈的就业市场中&#xff0c;重视技能的培养和提升&#xff0c;通过学习与实践&#xff0c;增强自己的竞争力&#xff0c;为未来的职业发展打下坚实的基础&#xff0c;不仅有助于解决各类工作技能问题&#xff0c;更能…

使用Mybatis批量插入大量数据的实践

前言 在项目开发过程中&#xff0c;我们经常会有批量插入的需求&#xff0c;例如&#xff1a;定时统计任务 但是受限于MySQL中 max_allowed_packet 参数限制&#xff0c;5.7版本默认值为4M&#xff0c;这显然不太符合我们的需求&#xff0c;当然我们也可以通过修改此值来适应…

STM32和DHT11使用显示温湿度度(代码理解)+单总线协议

基于STM32CT&#xff0c;利用DHT11采集温湿度数据&#xff0c;在OLED上显示。一定要阅读DHT11数据手册。 1、 DHT11温湿度传感器 引脚说明 1、VDD 供电3.3&#xff5e;5.5V DC 2、DATA 串行数据&#xff0c;单总线 3、NC 空脚 4、GND 接地&#xff0c;电源负极 硬件电路 微…

【网络安全学习】漏洞利用:BurpSuite的使用-03-枚举攻击案例

如何使用BurpSuite进行枚举攻击 1.靶场选择 BurpSuite官方也是有渗透的教学与靶场的&#xff0c;这次就使用BurpSuite的靶场进行练习。 靶场地址&#xff1a;https://portswigger.net/web-security 登录后如下图所示&#xff0c;选择**【VIEW ALL PATHS】**&#xff1a; 找…

【fastadmin开发实战】经营数据自动识别录入

项目场景描述&#xff1a;每日录入各个门店的员工经营数据&#xff0c;直接从微信复制报数、系统识别录入。 解决方案&#xff1a;各个门店按照固定的汇报模板进行汇报&#xff08;如福田店有员工1、2、3、4、5号员工&#xff0c;每个员工按模板报数&#xff09; 例如&#xf…

快手矩阵系统源码:构建高效短视频生态的引擎

在短视频内容创作和管理领域&#xff0c;快手矩阵系统源码提供了一套全面的解决方案&#xff0c;帮助用户和企业高效地构建和管理自己的短视频平台。本文将深入探讨快手矩阵系统源码的核心功能&#xff0c;以及它如何助力用户在短视频领域取得成功。 快手矩阵系统源码概述 快…

2-3 图像分类数据集

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

windows启动Docker闪退Docker desktop stopped

Windows启动Docker闪退-Docker desktop stopped 电脑上很早就安装有Docker了&#xff0c;但是有一段时间都没有启动了&#xff0c;今天想启动启动不起来了&#xff0c;打开没几秒就闪退&#xff0c;记录一下解决方案。仅供参考 首先&#xff0c;参照其他解决方案&#xff0c;本…

对SRS媒体服务器进行漏洞扫描时,SRS的API模块会出现漏洞,如何修补这些漏洞的简单方法

目录 一、引言 1、srs介绍 2、媒体流介绍 3、应用场景 二、SRS的http_api介绍、及漏洞 1、概述 2、http_api模块的作用 &#xff08;1&#xff09;提供HTTP API服务 &#xff08;2&#xff09;管理和监控SRS服务器 &#xff08;3&#xff09;自定义开发 三、漏洞扫描…

昆虫学(书籍学习资料)

包括昆虫分类&#xff08;上下册&#xff09;、昆虫生态大图鉴等书籍资料。

搜索+动态规划

刷题刷题刷题刷题 ​​​​​​​​​​​​​​Forgery - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a; 需要两个数组&#xff0c;一个数组全部初始化为".",另一个数组输入数据&#xff0c;每碰到一个“.”就进行染色操作&#xff0c;将其周围的…

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…

在C#/Net中使用Mqtt

net中MQTT的应用场景 c#常用来开发上位机程序&#xff0c;或者其他一些跟设备打交道比较多的系统&#xff0c;所以会经常作为拥有数据的终端&#xff0c;可以用来采集上传数据&#xff0c;而MQTT也是物联网常用的协议&#xff0c;所以下面介绍在C#开发中使用MQTT。 安装MQTTn…

【ARMv8/v9 GIC 系列 5.1 -- GIC GICD_CTRL Enable 1 of N Wakeup Function】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC Enable 1 of N Wakeup Function基本原理工作机制配置方式应用场景小结GIC Enable 1 of N Wakeup Function 在ARM GICv3(Generic Interrupt Controller第三代)规范中,引入了一个名为"Enable 1 of N Wakeup"的功能。…

图像的对数变换

对数变换在图像处理中通常有以下作用&#xff1a; 因为对数曲线在像素值较低的区域斜率较大&#xff0c;像素值较高的区域斜率比较低&#xff0c;所以图像经过对数变换之后&#xff0c;在较暗的区域对比度将得到提升&#xff0c;因而能增强图像暗部的细节。图像的傅里叶频谱其…

Ubuntu多显示器设置不同缩放比例

Ubuntu多显示器设置不同缩放比例 设备问题解决方案 设备 笔记本屏幕分辨率为2560 \times 1600&#xff0c;外接显示器的分辨率为3840 \times 2160。 问题 Ubuntu默认的显示器设置中&#xff0c;缩放仅能选择100%&#xff0c;200%&#xff0c;300%&#xff0c;400%。假…