头歌C语言数据结构(队列的应用)

news2024/11/24 11:04:10

第1关:循环队列

任务描述

本关任务:编写一个循环队列,实现入队、出队操作,判断队空、队满等特殊情况。

相关知识

为了完成本关任务,你需要掌握:1.循环队列定义,2.入队、出队的定义,3.队空、队满的情况。

循环队列定义

循环队列将数组存储区看成是一个首尾相接的环形区域(下图)。当数据存放到尾地址后,下一个地址就跳转到首地址。循环队列定义如下:

 
  1. struct Queue{
  2. int maxSize; // 队列最大长度
  3. int *data; // 数据指针
  4. int front; // 头指针索引
  5. int rear; // 尾指针索引
  6. };

入队出队定义

入队操作:队列未满,在队尾插入一个元素item,使得data[rear+1]=item,若超过存储空间则尾指针索引取模(rear+1)%maxSize

出队操作:队列不空,返回队首元素值data[front],并移除队首元素front+1,若超过存储空间则头指针索引取模(front+1)%maxSize

队空队满情况

初始化创建空队时,令front=rear=0, 其中front指向队首元素,rear指向队尾元素的下一个元素:

  • 当队空时:front==rear
  • 当队满时:front==rear 亦成立

因此只凭等式front==rear无法判断队空还是队满。 一个方法是少用一个元素空间,约定:队列头指针front在队尾指针rear的下一个位置上作为队列“满”状态的标志(如上图),即:

  • 队空时: front==rear
  • 队满时: (rear+1)%maxSize==front
编程要求

本关的编程任务是补全右侧代码片段isFullisEmptyenQueuedeQueueBeginEnd中间的代码,具体要求如下:

  • isFull中,判断队列是否为满,若满返回true并在一行打印The queue is Full,否则返回false
  • isEmpty中,判断队列是否为空,若空返回true并在一行打印The queue is Empty,否则返回false
  • enQueue中,实现入队操作:将元素item加入队列尾部;
  • deQueue中,实现出队操作:移除队列首部元素,并返回元素值。
测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入: 10 7 enqueue 30 enqueue 98 dequeue enqueue 96 dequeue dequeue enqueue 0 预期输出: 0 The queue is Empty

输入说明: 第一行n m分别表示循环队列大小、入队出队操作记录数量。 接下来m行,enqueue表示入队操作,后面接待入队元素;dequeue表示出队操作。

输出说明: 输出m个操作之后的所有队列元素。


开始你的任务吧,祝你成功!

//
//  queue_.cpp
//  Queue
//
//  Created by ljpc on 2018/5/29.
//  Copyright © 2018年 ljpc. All rights reserved.
//
 
#include "queue_.h"
 
 
void creatQueue(Queue* que, int maxSize)
//  创建一个循环队列指针que,队列最大长度为maxSize
{
    que->maxSize = maxSize;
    que->data = (int*)malloc(maxSize * sizeof(int));
    que->front = que->rear = 0;
}
 
void destroyQueue(Queue* que)
//  释放队列内存空间
{
    free(que->data);
}
 
bool isFull(Queue* que)
//  判断队列que是否为满
//  若满返回 true 并在一行打印  The queue is Full 末尾换行!!!
//  否则返回 false
 
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    if ((que->rear+1) % que->maxSize == que->front)
    {
        printf("The queue is Full\n");
        return true;
    }
    else return false;
    /********** End **********/
}
 
bool isEmpty(Queue* que)
//  判断队列que是否为空
//  若空返回 true 并在一行打印 The queue is Empty 末尾换行!!!
//  否则返回 false
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    if ((que->rear) % que->maxSize == que->front)
    {
        printf("The queue is Empty\n");
        return true;
    }   
    else 
    return false;
 
    /********** End **********/
}
 
int enQueue(Queue* que, int item)
//  实现入队操作:将元素item加入队列que尾部
//  若队列没满,编写加入操作,返回 1
//  若队列满了,不做任何操作,返回 -1
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    
    if (isFull(que))
    {
        return -1;
    }
    else 
    {
        que->data[que->rear] = item;
        que->rear=(que->rear+1)%que->maxSize;
        return 1;
    }
    /********** End **********/
}
 
int deQueue(Queue* que)
//  实现出队操作:移除队列que首部元素,并返回元素值
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    int x;
    if (isEmpty(que))
    {
        return false;
    }
    else 
    {
        x = que->data[que->front];
        que->front = (que->front + 1) % que->maxSize;        
    }
    return x;
 
    /********** End **********/
}
 
void printQueue(Queue* que)
//  打印队列
{
    while (isEmpty(que)==false) {
        int item = deQueue(que);
        printf("%d ", item);
    }
}

第2关:链队列

任务描述

本关任务:编写一个链队列,实现入队、出队操作,判断队空等特殊情况。

相关知识

为了完成本关任务,你需要掌握:1.链队列定义,2.入队、出队的定义,3.队空的情况。

链队列定义

链队列的定义是在单链表的基础上,增加一个尾指针。队列的特点是“先进先出”,因此只需要一头一尾两个指针,就可以快速地在队头取出数据,在队尾插入数据。

链队列动态创建节点,不需要预设大小,内存空间不需要连续,入队、出队更容易实现。但是存取速度慢,操作也比数组的方式更加复杂。

 
  1. struct Node // 数据节点
  2. {
  3. int data; // 数据类型
  4. Node *next; // 指向下一个节点的指针
  5. };
  6. struct LinkQueue // 链表队列
  7. {
  8. Node *front; // 头指针
  9. Node *rear; // 尾指针
  10. };

入队出队定义

入队操作:

  • 第一步:为待入队元素创建数据节点Node* node
  • 第二步:将队尾节点next指向新节点rear->next = node;
  • 第三步:修改队尾指针rear指向新节点rear = node

出队操作:队列不空,返回队首元素值。

  • 第一步:获取队首节点Node *node = front->next,注意front->next才是指向队列头节点,front本身不具备任何意义。
  • 第二步:移除队首节点,修改front->next = node->next
  • 特殊情况:当队列最后一个元素被删除后,队列尾指针也丢失了,因此需对队尾指针重新赋值,即指向头结点 rear = front
队空情况

初始化创建空队时,令rear = front,即队空的情况是rear == front

编程要求

本关的编程任务是补全右侧代码片段isEmptyenQueuedeQueueBeginEnd中间的代码,具体要求如下:

  • isEmpty中,判断队列是否为空,若空返回true并在一行打印The queue is Empty,否则返回false
  • enQueue中,实现入队操作:将元素item加入队列尾部;
  • deQueue中,实现出队操作:移除队列首部元素,并返回元素值。
测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入: 7 enqueue 30 enqueue 98 dequeue enqueue 96 dequeue dequeue enqueue 0 预期输出: 0 The queue is Empty

输入说明: 第一行m分别表示链队列入队出队操作记录数量。 接下来m行,enqueue表示入队操作,后面接待入队元素;dequeue表示出队操作。

输出说明: 输出m个操作之后的所有队列元素。


开始你的任务吧,祝你成功!

//
//  queue_.cpp
//  LinkQueue
//
//  Created by ljpc on 2018/5/30.
//  Copyright © 2018年 ljpc. All rights reserved.
//

#include "queue_.h"

void creatLinkQueue(LinkQueue* que)
//  创建一个循环队列指针que
{
    que->front = (Node*)malloc(sizeof(Node));
    que->rear = que->front;
    que->rear->next = NULL;
}

bool isEmpty(LinkQueue* que)
//  判断队列que是否为空
//  若空返回 true 并在一行打印 The queue is Empty 末尾换行!!!
//  否则返回 false
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    if (que->rear == que->front)
    {
        printf("The queue is Empty\n");
        return true;
    }
    return false;
    /********** End **********/
}

void enQueue(LinkQueue* que, int item)
//  实现入队操作:将元素item加入队列que尾部
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    Node *newque=(Node*)malloc(sizeof(Node));
    if(newque!=NULL)
    {
        newque->data=item;
        newque->next=NULL;
        que->rear->next=newque;
        que->rear=newque;
    }
    /********** End **********/
}

int deQueue(LinkQueue* que)
//  实现出队操作:移除队列que首部元素,并返回元素值
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    int x;
    Node* p = que->front->next;
    x = p->data;
    que->front->next = p->next;
    if (p == que->rear)
    {
        que->rear = que->front;
    }
    return x;
    /********** End **********/
}

void printQueue(LinkQueue* que)
//  打印队列
{
    while (isEmpty(que)==false) {
        int item = deQueue(que);
        printf("%d ", item);
    }
}




第3关:单链表循环队列

任务描述

本关任务:编写一个单链表循环队列,实现入队、出队操作,判断队空等特殊情况。

相关知识

为了完成本关任务,你需要掌握:1.单链表循环队列定义,2.入队、出队的定义,3.队空的情况。

单链表循环队列

单链表循环队列设一个尾指针rear,不设头指针。队尾添加数据的时候,只需要在rearrear->next之间插入该数据节点,然后将rear指向这个节点。因为没有头指针,所以添加一个整形变量size_来判定队列空的情况。

 
  1. struct Node // 数据节点
  2. {
  3. int data; // 数据类型
  4. Node *next; // 指向下一个节点的指针
  5. };
  6. struct CycleQueue // 循环链表队列
  7. {
  8. int size_; // 目前队列元素个数
  9. Node *rear; // 尾指针
  10. };
入队出队定义

注意初始队列时,尾指针rear = NULL以及rear->next = NULL

入队操作:

  • 为待入队元素创建数据节点Node* node
  • 如果队列为空,则尾节点指向新节点rear = noderear->next指向队首节点rear->next = node
  • 如果队列非空,则在rearrear->next之间插入新节点:
     
      
    1. Node *temp = rear->next;
    2. rear->next = node;
    3. node->next = temp;
    4. rear = node;
    5. rear->next = temp;

出队操作:队列不空,返回队首元素值。

  • 第一步:获取队首节点Node *node = rear->next;
  • 第二步:移除队首节点,修改rear->next = node->next
队空情况

队列中不含数据节点,通过变量size_来判定队列空的情况。

编程要求

本关的编程任务是补全右侧代码片段isEmptyenQueuedeQueueBeginEnd中间的代码,具体要求如下:

  • isEmpty中,判断队列是否为空,若空返回true并在一行打印The queue is Empty,否则返回false
  • enQueue中,实现入队操作:将元素item加入队列尾部;
  • deQueue中,实现出队操作:移除队列首部元素,并返回元素值。
测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入: 7 enqueue 30 enqueue 98 dequeue enqueue 96 dequeue dequeue enqueue 0 预期输出: 0 The queue is Empty

输入说明: 第一行m分别表示链队列入队出队操作记录数量。 接下来m行,enqueue表示入队操作,后面接待入队元素;dequeue表示出队操作。

输出说明: 输出m个操作之后的所有队列元素。


开始你的任务吧,祝你成功!

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
//
//  queue_.cpp
//  Cycle
//
//  Created by ljpc on 2018/5/30.
//  Copyright © 2018年 ljpc. All rights reserved.
//

#include "queue_.h"


void creatCycleQueue(CycleQueue* que)
//  创建一个循环队列指针que
{
    que->size_ = 0;
    que->rear = NULL;
}

bool isEmpty(CycleQueue* que)
//  判断队列que是否为空
//  若空返回 true 并在一行打印 The queue is Empty 末尾换行!!!
//  否则返回 false
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    if (que->size_ == 0)
    {
        printf("The queue is Empty\n");
        return true;
    }
    return false;
    /********** End **********/

}

void enQueue(CycleQueue* que, int item)
//  实现入队操作:将元素item加入队列que尾部
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    Node* newque = (Node*)malloc(sizeof(Node));
    newque->data = item;
    if (que->size_ > 0)
    {
        newque->next = que->rear->next;
        que->rear->next = newque;
        que->rear = newque;
        que->size_++;
    }
    else
    {
        que->rear = newque;
        que->rear->next = newque;
        que->size_++;
    }
    /********** End **********/
}

int deQueue(CycleQueue* que)
//  实现出队操作:移除队列que首部元素,并返回元素值
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    Node* p;
    int x;
    if (isEmpty(que))
    {
        return false;
    }
    if (que->size_ == 1)
    {
        x = que->rear->data;
        p = que->rear;
        que->rear = NULL;
        free(p);
    }
    if (que->size_ > 1)
    {
        p = que->rear->next;
        que->rear->next = p->next;
        x = p->data;
        free(p);
    }
    que->size_--;
    return x;
    /********** End **********/

}

void printQueue(CycleQueue* que)
//  打印队列
{
    while (isEmpty(que) == false) {
        int item = deQueue(que);
        printf("%d ", item);
    }
}

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

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

相关文章

别的项目都有 awesome 仓库,RT-Thread 也要有!

awesome 仓库是 GitHub 上用于收集某个项目或者某个语言相关的优质内容的仓库,例如中间件、新闻资讯、网站等。 作为 RT-Thread 开发者,看到别的项目都有 awesome 仓库,我想 RT-Thread 也应该有! 于是,我创建一个 aw…

pyqt5将ui文件转为python文件

在pyqt5中使用 pyuic将ui文件转为py文件: 例如:将home.ui文件转为vio_detect.py文件,所需命令如下: pyuic5 -x home.ui -o vio_detect.py

Python彻底解决TypeError的问题

今天看到一个问题: TypeError: int() argument must be a string, a bytes-like object or a number, not list 代码是这样的: id int(os.path.split(imagePath)[1].split(.)[0]) 其实这个提示已经非常明显了,百度翻译过来就是&#xff1a…

废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp(源码搭建/上线/运营/售后/更新)

一款基于FastAdminThinkPHPUniApp开发的废品回收系统,适用废品回收站、再生资源回收公司上门回收使用的小程序。 一、FastAdmin框架特色功能及优势 模块化开发:控制器、模型、视图、JS一一对应,使用RequireJS进行插件机制,支持插…

一文弄懂 Linux 系统调用函数之 exec 函数族

目录 简介函数原型参数说明返回值函数区别使用示例采用参数列表传递参数,以 execl 为例采用参数数组传递参数,以 execv 为例调用 PATH 下可执行文件,以 execlp 为例使用新的环境变量给新进程,以 execle 为例 更多内容 简介 exec …

【CMU 15-445】Proj4 Concurrency Control

Concurrency Control 通关记录Task1 TimestampsTask2 Storage Format and Sequential ScanTask3 MVCC ExecutorsTask3.1 Insert ExecutorTask3.2 CommitTask3.3 Update and Delete ExecutorTask3.4 Stop-the-world Garbage Collection Task4 Primary Key IndexTask4.0 Index Sc…

32 OpenCV Harris角点检测

文章目录 cornerHarris 算子示例 角点检测 cornerHarris 算子 void cv::cornerHarris ( InputArray src,OutputArray dst,int blockSize,int ksize,double K,int borderType BORDER_DEFAULT) src:待检测Harris角点的输入图像,图像必须是CV 8U或者CV 32F的单通道…

【计算机毕业设计】基于微信小程序高校寻物平台

随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于 微信小程序的高校寻物平台的开发全过程。通过分析基于微信小程序的高校寻物平台管理的不足,创建了一个计算机管理基于微信小程序的高校寻物平台的方案…

找不到d3dx9_42.dll无法继续执行代码的原因分析及解决方法

当您在使用电脑过程中遇到提示“缺少d3dx9_42.dll”时,这实际上是操作系统在运行某些应用程序或游戏时遇到的一个常见问题。D3DX9_42.dll是DirectX 9的一部分,DirectX是一组由微软开发的多媒体处理软件组件,广泛用于提升游戏与多媒体程序的性…

智慧公厕解决了什么问题?

在现代城市生活中,公厕是一个不可忽视的环节。然而,过去的公共厕所常常存在管理不力、环境脏乱差等问题,给人们的生活带来了许多不便和困扰。为了解决这些问题,智慧公厕应运而生,成为了公共厕所使用、运行、管理、养护…

每日两题 / 101. 对称二叉树 230. 二叉搜索树中第K小的元素(LeetCode热题100)

101. 对称二叉树 - 力扣(LeetCode) 用两个指针同时遍历树的左右子树即可 每次遍历时,一个指针向左,另一个就要向右。一个向右,另一个就要向左 /*** Definition for a binary tree node.* struct TreeNode {* in…

【Stylus详解与引入】

文章目录 Stylus详解与引入一、Stylus简介二、Stylus的特性1. 变量2. 嵌套规则3. 混合(Mixins)4. 函数5. 条件语句和循环 三、Stylus的引入与配置1. 安装Stylus和stylus-loader2. 配置Webpack3. 在Vue项目中使用Stylus4. 编译Stylus代码四、Stylus的性能…

第二步->手撕spring源码之bean操作

本步骤目标 本步骤继续完善 Spring Bean 容器框架的功能开发,在这个开发过程中会用到较多的接口、类、抽象类,它们之间会有类的实现、类的继承。 这一次我们把 Bean 的创建交给容器,而不是我们在调用时候传递一个实例化好的 Bean 对象&#x…

VMware配置Kali linux + 物理机连接Xshell

VMware 配置 kali linux 首先需要先安装VMware Workstation 我是在Windows 安装的 VMware Workstation Pro 17 虚拟化,产品密钥。。这里不做多说了 下载kali linux 这里我下载的是kali-linux-2024.1 Note:这里选Virtual Machines,建议不要…

数据分享—鄱阳湖矢量边界数据

鄱阳湖位于中国江西省北部,是中国最大的淡水湖泊之一,也是长江流域第一大湖。鄱阳湖水域广阔,湖区面积约为3600平方公里。鄱阳湖拥有丰富的水生生物资源,湖中有多种淡水鱼类和水生植物,是重要的渔业资源基地之一。湖泊…

RocketMQ(一)

作用 1. 限流削峰 2. 异步解耦 组成 Producer:消息的发送者,生产者;举例:发件人 Consumer:消息接收者,消费者;举例:收件人 Broker:暂存和传输消息的通道&#xff1…

简要介绍三大脚本语言 Shell、Python 和 Lua

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 脚本语言是一种用于自动化操作系统任务和应用程序功能的编程语言。它们通常用于编写小到中等规模的程序,以提高任务执行的速度和效率。在众多脚本语言中,Shell、Python 和 Lua 是…

一竞技LOL:中韩首场对决暴露TES大问题 BLG和T1的比赛成为焦点!

北京时间5月12日,昨天结束的MSI比赛中第二场比赛是本次MSI第一场中韩大战,由LCK赛区的一号种子GEN战队对阵LPL的二号种子TES战队。TES最终是2:3非常遗憾的输给了Gen,这也意味着TES将要去败者组,本场比赛也是暴露出了TES战队比较大的问题,中单的英雄池以及上单369的状态成为TES战…

【Java】:向上转型、向下转型和ClassCastException异常

目录 先用一个生动形象的例子来解释向上转型和向下转型 向上转型(Upcasting) 向下转型(Downcasting) 向上转型 概念 例子 发生向上转型的情况 1.子类对象赋值给父类引用 2.方法参数传递 3.返回值 向下转型 概念 注意…

【数字IC设计】芯片设计中的RDC

RDC问题定义 在芯片设计中,RDC是reset domain crossing 的缩写,类似于CDC(clock domain crossing),由于现在SOC芯片是有很多ECUs组成,为了使整个系统能够快速从复位中恢复, 用户希望SOC里面每个ECU模块都可以有自己独立的异步复位信号,这样可以在出问题的时候只复位有错…