[PTA]:R7-6 队列操作 思路分享 [数据结构] [队列及其链式存储] [c++]

2023-10-30

目录

一.队列以及其链式存储的介绍

二. 题目复现及分析

三. 代码展示(c++)

一.队列以及其链式存储的介绍

1. 队列:

属于线性表的一种,它的特殊点在于具有先进先出的特点(只允许在表头删除元素,表尾进行插入元素)。

同样的,它也有两种存储方式:顺序存储和链式存储。今天我们所完成的这道题就是使用队列的链式存储。如下图1所示:

图1

  (1)front、next、rear 为队列结点类型的指针,指向队列节点。

   (2)front、next分别为(一直)指向这一队列链表的头结点和尾节点。

   (3)一般的,我们会多设置一个不存放data头结点。让front指针指向它,它指向下一个存放data的结点(首元结点),如图2,本题便用这种形式。  

图2

2.学习中难理解点:

(1)为什么要设头指针front和尾指针rear?

         因为队列要具有先进先出的特点,先入队的元素越靠近头部,因此可以直接利用头指针删除第一个结点;同样的可以直接利用尾指针添加结点。

(2)每个结点包括了什么?

         一个存放数据data元素的数据域;一个存放该结点类型的指针next(指向下一个结点),用于联系每个结点的关系用以组成整个链表。

3.具体入队出队初始化操作在代码展示那注释

二. 题目复现及分析

R7-6 队列操作 (20 分)

请实现一个MyQueue类,实现出队,入队,求队列长度.

实现入队函数 void push(int x); 实现出队函数 int pop(); 实现求队列长度函数 int size();

输入格式:

每个输入包含1个测试用例。每个测试用例第一行给出一个正整数 n (n <= 10^6) ,接下去n行每行一个数字,表示一种操作: 1 x : 表示从队尾插入x,0<=x<=2^31-1。 2 : 表示队首元素出队。 3 : 表示求队列长度。

输出格式:

对于操作2,若队列为空,则输出 “Invalid”,否则请输出队首元素。 对于操作3,请输出队列长度。 每个输出项最后换行。

输入样例:

5
3
2
1 100
3
2
  • 第一个输入的n控制所做操作的次数,可以用循环控制。
  • 接下来是3或1或2表示不同操作,用if语句控制。
  • 用Queue类实例化一个队列对象来进行这些方法操作。

题目中还要求结尾无空行,但是我试过有空行还是会通过,所有我的代码没有考虑结尾无空行。如果要考虑进去,可以从它的操作次数n下手,当n==0时输出不带空格。)

输出样例:

0
Invalid
1
100

三. 代码展示(c++)

#include<iostream>
using namespace std;
/*
队列Queue类,封装了队列结点、指向队头和队尾的指针以及队列的一些操作;
*/
class Queue {
    private:
    //队列结点
        typedef struct QNode{
            int data;
            struct QNode*next;
        }QNode,*Qpointer;
//指向队头和队尾的指针结构体
        typedef struct {
            Qpointer front;
            Qpointer rear;
            int size;
        }LinkQueue;
    
    private:
    //声明一个队列指针结构体
        LinkQueue linkq;
    
    public:
    //构造队列(初始化)
        Queue() {
            linkq.front=new QNode;//开辟一个队列结点(此时为头结点)类型内存,让linkq的头指针指向该内存
            linkq.rear=linkq.front;//让尾指针暂时指向头指针
            linkq.front->next=NULL;//头节点next置NULL
            linkq.size=0;//初始化队列长度为0;
        }
        
    //入队
        void push(int x) {
            //以下三行为开辟一个新队列结点,存放入队元素,同时next置NULL
            QNode* p=new QNode;
            p->data=x;
            p->next=NULL;
            //以下三行为将这个新结点接入队列链的尾部(此时这个新节点和队列链没有 任何关系)
            linkq.rear->next=p;/*因为rear指针总指向最后一个结点,因此rear.next为最后一个结点的next指针。
               这一步目的是将队列链尾结点指向新的结点,让新结点成为尾结点。*/
            //另外,判断队空的条件就是rear是否指向front指针(front始终不动,指向第一个结点)
            linkq.rear=p;//因为新结点成为了尾结点,rear指针自然的要更新其指向的结点,去指向这个新结点
            linkq.size++;//每没入队一个结点,则长度加一;
        }
     //出队
        int pop(bool& status) {
            status=true;//这个status引用为了检查是否队空
            int elem;
            if(linkq.front==linkq.rear)//队空,status为false
            {
                status=false;
                return -1;//结束
            }
            //若非空
            QNode *q;//声明一个结点指针
            q=linkq.front->next;/*让q指针指向该队链第一个存放data的结点,目的是方便取这个出队结点的data及判别该节点是否是
            尾结点(front指向第一个结点即头结点,头节点的下一个元素才是存放data的结点)*/
            
            //因为出队第一个存放data的结点,因此只要将front头指针指向该结点,而指向出队结点的下一个结点就行了
            linkq.front->next=linkq.front->next->next;
            if(linkq.rear==q)//队空
            {
                /*若要删除的结点恰好是尾结点,删除之后队链便没有了存放data的结点,为队空。因此我们
             要让队尾rear指针重新指向front指向的存储位置(回到初始化时的状态)*/
                linkq.rear=linkq.front;
            }
            elem=q->data;//返回出队结点的data
            delete q;//释放出队结点的内存
            linkq.size--;//队长度减一
            
            return elem;
        }
    
        int getSize()//返回队列长度
        {
            return linkq.size;
        }
};

int main()
{
    Queue Q;//实例化一个Queue对象,并初始化Q
    bool status;
    int N;//控制操作次数
    int frontelem;
    int elem;
    int choice;
    cin>>N;
    while(N--)
    {
        cin>>choice;
        if(choice==1)
        {
            cin>>elem;
            Q.push(elem);
        }
        else if(choice==2)
        {
            frontelem=Q.pop(status);
            if(status)//判断是否队空
                cout<<frontelem<<endl;
            else
                cout<<"Invalid"<<endl;
        }
        else if(choice==3)
        {
            cout<<Q.getSize()<<endl;
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[PTA]:R7-6 队列操作 思路分享 [数据结构] [队列及其链式存储] [c++] 的相关文章

  • masscan扫描结果转成Excel

    coding UTF 8 from openpyxl import Workbook wb Workbook ws wb active row 2 filedir result1 txt result2 txt filedir live x
  • 在vue3使用Pinia

    今年到今天已經過了一大半了 又有新的技術需要學習了 這次由於vue3的到來vuex也被官方deprecated 隨之取代的則是Pina 本篇紀錄學習Pina的相關筆記 定義 一個 store 為什麼是一個呢 這是因為在pinia中可以將st

随机推荐

  • 【Windows编程】windows窗口创建过程详解

    文章目录 前言 1 应用程序的分类 2 应用程序分类的对比 3 编译工具 4 windows库文件和头文件 5 WinMain函数和MessageBox函数初始 6 窗口类 7 窗口类的分类 8 注册窗口类函数 9 注册窗口类的结构体 10
  • Golang xml 使用

    解析和读取规则 golang对xml的解析和读取是通过stuct和refect实现的 对于struct中的tag以什么方式对应到xml的元素上 golang的文档中做了如下描述 结构体中的XMLName字段或者类型为xml Name的字段
  • Redis-stack 初体验

    一 安装方式 二 Docker安装流程 1 选择镜像 获取镜像 2 启动容器 一 安装方式 通过源码安装redis stack 通过docker安装redis stack 在Linux上安装redis stack 在MasOS上安装redi
  • 常用的台湾繁体字字体(轉)

    台灣繁體字常用的字體有 細明體 新細明體 標楷體 宋體 新宋體 仿宋體 最常用的是細明體和標楷體 其實 這些字體除前三者在中國不常使用外 其他的在中國也使用 字庫 http www font net cn 转载于 https www cnb
  • STM32中 嘀嗒定时器中 SysTick_CTRL_ENABLE的含义说明

    1 使能滴答定时器 SysTick gt CTRL SysTick CTRL ENABLE Msk 关闭滴答定时器 SysTick gt CTRL SysTick CTRL ENABLE Msk 2 宏定义的说明 define SysTic
  • 记忆网络之Dynamic Memory Networks模型介绍及代码实现

    记忆网络之Dynamic Memory Networks 今天我们要介绍的论文是 Ask Me Anything Dynamic Memory Networks for Natural Language Processing 这篇论文发表于
  • keil5报错解决方法

    include
  • MyEclipse的安装和使用

    目录 1 编写第一个Java程序 1 创建Java源程序 2 编译并运行 HelloWorld java 文件 1 1 4 Java跨平台原理 1 2 1 MyEclipse的安装和使用 1 下载MyEclipse软件 2 安装 破解MyE
  • python异常处理、爬虫介绍、模块(module)的导入及爬虫准备工作

    先看后赞 养成习惯 点赞收藏 人生辉煌 目录 1 错误与异常 1 1异常简介 1 2 作业 2 python爬虫 2 1 任务介绍 2 2 爬虫初始 2 3 基本流程 2 4 编码规范 2 5 引入模块 1 错误与异常 1 1异常简介 看如
  • PhpStorm 2020 JetBrains出品的高效智能PHP编程IDE

    PhpStorm深刻 理解您的代码 主流框架支持 PhpStorm 完美支持 Symfony Laravel Drupal WordPress Zend Framework Magento Joomla CakePHP Yii 等各种主流框
  • 用 nebula_dart_gdbc 在移动设备玩图数据库,泰酷辣!

    nebula dart gdbc 是访问 NebulaGraph 的 Dart 语言客户端 在 dart gdbc 的规范下进行开发 dart gdbc 是一套使用 Dart 语言定义的图数据库标准数据接口 整体思路参考了 JDBC 的规范
  • 【白水】对于markdown笔记与资料管理的思考与优化尝试【持续更新】

    关键词 markdown 笔记 文献管理 流程图 思路 爬虫 前言 读书笔记千万种 各大笔记思路几乎都是相似的 怎么才能用利用各种markdown编辑器 加上python的一些基础的代码逻辑完成文献管理 尽量高效快捷的完成 读书笔记流程 关
  • Qt5学习笔记基础篇(3)Qt中的字符串操作

    Qt中的字符串操作 3 1 概述 对于一个应用程序来说 文本操作几乎是无处不在的 无论是窗体应用还是控制台应用都难免要做诸如显示 输入 处理文本之类的操作 因此字符串作为文本的载体也就必不可少 大多数编程语言都直接或者间接的提供了字符串类型
  • 自定义Kettle数据库插件

    项目需要实现使用Kettle向神通数据库中写入数据 Kettle官方标准的数据库插件里面并没有对神通数据库的支持 因此需要自己写一个数据库插件 下面我们开始写一个数据库插件 1 在eclipse中创建一个maven项目 然后修改pom xm
  • 数据库-数据库安全性

    这篇博客内容有些琐碎繁杂 我整理的时候有很多上课时老师没有讲的 但我自己在看的时候看了看 感觉有必要再整理一下 跟考试等无关 就是多了解下关于数据库的 所以后面的理论性东西很多 大家看的时候根据目录看下有没有需要的 这篇实在有点多 我都写炸
  • 【读书笔记】周志华 机器学习 第二章 模型评估和选择

    第二章 模型评估和选择 1 欠拟合和过拟合 偏差和方差 1 1 欠拟合和过拟合 1 2 偏差和方差 2 评估方法 性能度量 2 1 评估方法 2 1 1 留出法 2 2 2 交叉验证法 2 2 3 自助法 2 2 性能度量 2 2 1 错误
  • linux内核参数优化

    linux内核参数查看与修改 Linux在系统运行时可以修改内核参数 proc sys或 etc sysctl conf 而无需重新引导系统 这个功能是通过 proc虚拟文件系统实现的 在 proc sys目录下存放着大多数的内核参数 并且
  • 【思考】java中xml文件得到的sql查询字段是如何与对象类中的属性字段对应的?有顺序要求吗?

    在Java中可以使用XML文件来配置数据库查询语句以及将查询结果映射到Java对象 通常 这样的任务可以使用框架如MyBatis或Hibernate来完成 以下是一个示例 演示如何使用MyBatis进行这样的操作 首先 需要创建一个XML文
  • Python变量和数据类型,类型转换

    a 变量的定义 把数据分别用一个简单的名字代表 方便在接下来的程序中引用 变量就是代表某个数据 值 的名称 变量就是用来存储数据的 将不同的数据类型存储到内存 b 变量的赋值 变量名 初始值 初始值 为了确定变量的类型 name Heygo
  • [PTA]:R7-6 队列操作 思路分享 [数据结构] [队列及其链式存储] [c++]

    目录 一 队列以及其链式存储的介绍 二 题目复现及分析 三 代码展示 c 一 队列以及其链式存储的介绍 1 队列 属于线性表的一种 它的特殊点在于具有先进先出的特点 只允许在表头删除元素 表尾进行插入元素 同样的 它也有两种存储方式 顺序存