数据结构实验二之栈和队列(上)——环形队列和链队

news2024/9/29 16:22:38

实验题3:实现环形队列的各种基本运算的算法

题目描述

编写一个程序sqqueue.cpp,实现环形队列(假设栈中的元素类型ElemTye为char)的各种基本运算,并在此基础上设计一个程序exp3-3.cpp完成以下功能。

(1)初始化队列q。

(2)判断队列q是否非空。

(3)依次进队元素a、b、c。

(4)出队一个元素,输出该元素。

(5)依次进队元素d、e、f。

(6)输出出队序列。

(7)释放队列。

sqqueue.cpp程序,其中包含如下函数。

· InitQueue(SqQueue *&q):初始化环形队列q。

· DestroyQueue(SqQueue *&q):销毁环形队列q。

·QueueEmpty(SqQueue *q):判断环形队列q是否为空。

· enQueue(SqQueue *&q,ElemType e):环形队列进队一个元素e。

·deQueue(SqQueue *&q,ElemType &e):环形队列出队一个元素e。

运行代码

sqqueue.cpp
#include<iostream>
using namespace std;
#include<stdio.h>
#include<malloc.h>
#define Maxsize 100
typedef char Elemtype;
typedef struct {
	Elemtype data[Maxsize];
	int front,rear;
}SqQueue;
//初始化队列q
void InitQueue(SqQueue*& q) {
    q = (SqQueue*)malloc(sizeof(SqQueue));
    q->front = q->rear = 0;
}
// 销毁队列 q
void DestoryQueue(SqQueue*& q) {
    free(q);
}

// 判断队列 q 是否为空
bool QueueEmpty(SqQueue* q) {
    return(q->front == q->rear);
}

// 进队列 q
bool enQueue(SqQueue*& q, Elemtype e) {
    if ((q->rear + 1) % Maxsize == q->front)
        return false;
    q->rear = (q->rear + 1) % Maxsize;
    q->data[q->rear] = e;
    return true;
}

// 出队列 q
bool deQueue(SqQueue*& q, Elemtype& e) {
    if (q->front == q->rear)
        return false;
    q->front = (q->front + 1) % Maxsize;
    e = q->data[q->front];
    return true;
}
exp3-3.cpp
#include "sqqueue.cpp"
using namespace std;
int main() {
    Elemtype e;
    SqQueue* q;
    cout << "环形队列的基本运算如下:\n";
    cout << "  (1)初始化队列 q\n";
    InitQueue(q);
    cout << "  (2)依次进入队列的元素为 a,b,c\n";
    if (!enQueue(q, 'a')) printf("\t提示:队满,不能进队\n");
    if (!enQueue(q, 'b')) printf("\t提示:队满,不能进队\n");
    if (!enQueue(q, 'c')) printf("\t提示:队满,不能进队\n");
    cout << "  (3)队列为" << (QueueEmpty(q) ? "空" : "非空") << endl;
    if (deQueue(q, e) == 0)
        cout << ("队空,不能出队\n");
    else
        cout << "  (4)出队的第一个元素:" << e << endl;
    cout << "  (5)依次进队列的元素:d,e,f\n";
    if (!enQueue(q, 'd')) printf("\t提示:队满,不能进队\n");
    if (!enQueue(q, 'e')) printf("\t提示:队满,不能进队\n");
    if (!enQueue(q, 'f')) printf("\t提示:队满,不能进队\n");
    cout << "  (6)出队列序列";
    while (!QueueEmpty(q)) {
        deQueue(q, e);
        cout << e << " ";
    }
    cout << endl;
    cout << "  (7)释放队列\n";
    DestoryQueue(q);
    return 1;
}

代码思路

环形队列(也称为循环队列)的基本操作,包括初始化、进队、出队、判断队列是否为空以及销毁队列等功能,并在 main 函数中对这些功能进行了测试。

  1. InitQueue 函数:作用是初始化环形队列。通过动态分配内存为环形队列结构体 SqQueue 分配空间,并将队首指针 front 和队尾指针 rear 初始化为 0,表示队列为空。

  2. DestoryQueue 函数:用于销毁环形队列。释放动态分配给环形队列的内存空间。

  3. QueueEmpty 函数:判断环形队列是否为空。如果队首指针 front 等于队尾指针 rear,则说明队列为空,返回 true;否则返回 false

  4. enQueue 函数:实现进队操作。

    • 首先检查队列是否已满,判断条件是 (q->rear + 1) % Maxsize == q->front,如果满足这个条件则表示队列已满,进队失败,返回 false
    • 如果队列未满,将队尾指针 rear 向后移动一位(q->rear = (q->rear + 1) % Maxsize),并将元素 e 存入队尾位置(q->data[q->rear] = e),然后返回 true
  5. deQueue 函数:执行出队操作。

    • 检查队列是否为空,如果队首指针 front 等于队尾指针 rear,则出队失败,返回 false
    • 如果队列非空,将队首指针 front 向后移动一位(q->front = (q->front + 1) % Maxsize),并将队首元素赋值给变量 e,然后返回 true

实验题4:实现链队的各种基本运算的算法

题目描述

编写一个程序liqueue.cpp,实现链队(假设栈中的元素类型ElemType为char)

的各种基本运算,并在此基础上设计一个程序exp3-4.cpp完成以下功能。

(1)初始化链队q。

(2)判断链队q是否非空。

(3)依次进队元素a、b、c。

(4)出队一个元素,输出该元素。

(5)依次进队元素d、e、f。

(6)输出出队序列。

(7)释放链队。

liqueue.cpp程序,其中包含如下函数。

· InitQueue(LinkQuNode*&q):初始化链队q。

· DestroyQueue(LinkQuNode *&q):销毁链队q。

· QueueEmpty(LinkQuNode*q):判断链队q是否为空。

· enQueue(LinkQuNode*&q,ElemType e):链队进队一个元素e。

· deQueue(LinkQuNode *&q,ElemType &e):链队出队一个元素e。

运行代码

liqueue.cpp
#include<iostream>
using namespace std;
#include<stdio.h>
#include<malloc.h>
#define Maxsize 100
typedef char Elemtype;
typedef struct DataNode {
    Elemtype data;
    struct DataNode* next;
}DataNode;
typedef struct {
    DataNode* front;
    DataNode* rear;
}LinkQuNode;//声明链队类型
//初始化链队q
void InitQueue(LinkQuNode*& q) {
    q = (LinkQuNode*)malloc(sizeof(LinkQuNode));
    q->front = q->rear = NULL;
}
// 销毁链队 q
void DestoryQueue(LinkQuNode*& q) {
    DataNode* p = q->front, * r;
    if (p != NULL) {
        r = p->next;
        while (r != NULL) {
            free(p);
            p = r; r = p->next;
        }
    }
    free(p);
    free(q);
}
// 判断链队 q 是否为空
bool QueueEmpty(LinkQuNode* q) {
    return( q->rear==NULL);
}
// 进队
void enQueue(LinkQuNode*& q, Elemtype e) {
    DataNode* p;
    p = (DataNode*)malloc(sizeof(DataNode));
    p->data = e;
    p->next = NULL;
    if (q->rear == NULL)
        q->front=q->rear = p;
    else {
        q->rear->next = p;
        q->rear = p;
    }
}
// 出链队 q
bool deQueue(LinkQuNode*& q, Elemtype& e) {
    DataNode* t;
    if (q->rear==NULL)
        return false;
    t = q->front;
    if (q->front == q->rear)
        q->front = q->rear = NULL;
    else
        q->front = q->front->next;
    e = t->data;
    free(t);
    return true;
}
exp3-4.cpp
#include "liqueue.cpp"
using namespace std;
int main() {
    Elemtype e;
    LinkQuNode* q;
    cout << "链队的基本运算如下:\n";
    cout << "  (1)初始化链队 q\n";
    InitQueue(q);
    cout << "  (2)依次进入链队的元素为 a,b,c\n";
    enQueue(q, 'a');
    enQueue(q, 'b');
    enQueue(q, 'c');
    cout << "  (3)链队为" << (QueueEmpty(q) ? "空" : "非空") << endl;
    if (deQueue(q, e) == 0)
        cout << ("\t提示:队空,不能出队\n");
    else
        cout << "  (4)出队一个元素:" << e << endl;
    cout << "  (5)依次进链队的元素:d,e,f\n";
    enQueue(q, 'd');
    enQueue(q, 'e');
    enQueue(q, 'f');
    cout << "  (6)出链队序列";
    while (!QueueEmpty(q)) {
        deQueue(q, e);
        cout << e << " ";
    }
    cout << endl;
    cout << "  (7)释放链队\n";
    DestoryQueue(q);
    return 1;
}

代码思路

实现了链队(一种基于链表实现的队列数据结构)的基本操作,包括初始化、进队、出队、判断队列是否为空以及销毁队列等功能,并在 main 函数中对这些功能进行了测试。

  1. InitQueue 函数:作用是初始化链队。通过动态分配内存为链队结构体 LinkQuNode 分配空间,并将队首指针 front 和队尾指针 rear 初始化为 NULL,表示队列为空。

  2. DestoryQueue 函数:用于销毁链队。首先遍历链表,从队首开始,依次释放每个节点的内存空间。使用两个指针 p 和 rp 指向当前节点,r 指向下一个节点。在循环中,先释放 p 指向的节点,然后将 p 指向 rr 指向下一个节点,直到遍历完整个链表。最后释放链队结构体的内存空间。

  3. QueueEmpty 函数:判断链队是否为空。如果队尾指针 rear 为 NULL,则说明队列为空,返回 true;否则返回 false

  4. enQueue 函数:实现进队操作。

    • 首先动态分配一个新节点 p,将待进队元素 e 存入新节点的数据域 data,并将新节点的 next 指针初始化为 NULL
    • 如果队列为空(即队尾指针 rear 为 NULL),则将队首指针 front 和队尾指针 rear 都指向新节点。
    • 如果队列不为空,则将当前队尾节点的 next 指针指向新节点,然后将队尾指针 rear 指向新节点。
  5. deQueue 函数:执行出队操作。

    • 如果队列为空(即队尾指针 rear 为 NULL),则出队失败,返回 false
    • 如果队列非空,将队首节点赋值给临时指针 t。如果队首节点就是队尾节点(即只有一个节点),则将队首指针 front 和队尾指针 rear 都置为 NULL;否则将队首指针 front 指向队首节点的下一个节点。然后将队首节点的数据域 data 赋值给变量 e,释放队首节点的内存空间,并返回 true

环形队列和链队的异同

相同点

  1. 逻辑结构:两者都遵循队列先进先出(FIFO - First In First Out)的原则。在这两种数据结构中,最先进入的数据元素将最先被取出,就像排队一样,先到的人先接受服务。
  2. 基本操作功能:都具备队列的基本操作,包括初始化(创建一个空的队列结构)、判断队列是否为空(确定队列中是否有元素)、入队(将元素添加到队列尾部)、出队(将队列头部的元素移除)等操作。这些操作在概念上是相同的,只是在具体的实现方式上存在差异。

不用点

  1. 存储结构
    • 环形队列:环形队列通常基于数组实现,它利用数组的循环特性来模拟队列的操作。在环形队列中,需要通过取模运算来处理队首和队尾指针的移动,以实现循环利用数组空间的目的。例如,在判断队满和队空条件以及指针的移动操作(如入队时队尾指针 rear=(rear + 1)%Maxsize,出队时队首指针 front=(front+1)%Maxsize)上都体现了这种循环特性。这种存储结构的优点是实现相对简单,并且在空间利用上较为高效(不需要额外的指针域来存储节点间的连接关系),访问元素时可以直接通过数组下标进行,速度较快。但是,它的缺点是需要预先确定数组的大小,如果队列中元素数量超过数组大小,可能会出现问题(如队满判断不准确等)。
    • 链队:链队是通过链表实现的,由节点组成,每个节点包含数据域和指向下一个节点的指针域。链队中的节点在内存中可以不连续存储,通过指针将各个节点连接起来形成队列结构。这种存储方式的优点是可以动态地分配内存,不需要预先确定队列的大小,适合处理元素数量不确定或者变化较大的情况。然而,由于需要额外的指针域来存储节点之间的连接关系,并且访问元素需要通过指针遍历链表,所以在空间和时间效率上相对环形队列可能会稍低一些。
  2. 空间利用效率
    • 环形队列:环形队列预先分配固定大小的数组空间,如果队列中元素较少,会造成一定的空间浪费;但由于不需要额外的指针空间(相比于链队),在元素数量接近数组容量时,空间利用率较高。
    • 链队:链队的空间是根据实际元素数量动态分配的,每个节点除了数据域外还需要额外的指针域,所以在存储少量元素时,由于指针域的存在会占用一定的额外空间。不过,链队不会像环形队列那样存在固定大小导致的空间浪费问题,适合元素数量波动较大的情况。
  3. 操作的实现细节
    • 环形队列:在入队操作时,需要检查队列是否已满,通过特定的队满判断条件(如 (rear + 1)%Maxsize==front)来确定,并且队尾指针的移动通过取模运算实现循环效果。出队操作时同样需要检查队列是否为空(front==rear),队首指针的移动也涉及取模运算。
    • 链队:入队操作需要动态分配新的节点内存,当队列为空时需要特殊处理队首和队尾指针(都指向新节点),非空时只需将新节点连接到队尾并更新队尾指针。出队操作要判断队列是否为空,若队首节点是队尾节点(即只有一个节点)时需要特殊处理队首和队尾指针(都置为 NULL),否则只需更新队首指针并释放出队节点的内存。

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

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

相关文章

【工具变量】无废城市试点DID数据集(2000-2023)

数据简介&#xff1a;2018年&#xff0c;国务院办公厅发布了《“无废城市”建设试点工作方案》&#xff0c;明确了“无废城市”的概念&#xff0c;强调通过创新、协调、绿色、开放的理念&#xff0c;推动城市固体废物管理的综合改革&#xff0c;力求实现固体废物产生量最小、资…

AI新方向:OpenAI o1是一个更擅长思考的模型系列:高级推理+逻辑严密+更广泛的知识,用于解决复杂的逻辑问题,慢思考

之前推出AI store感觉偏应用&#xff0c;也千篇一律&#xff0c;是AI的一个方向&#xff1a;广度。 现在推出o1 更严密的逻辑&#xff0c;也是AI的一个方向&#xff1a;深度。花更多时间&#xff0c;推理复杂的任务并解决比以前的科学、编码和数学模型更难的问题。确保AI的使用…

大模型训练技术:使用QLM提升Qwen2-7B 128k训练效率3.4倍

大模型训练技术&#xff1a;使用QLM提升Qwen2-7B 128k训练效率3.4倍 原创 一、引言 自Transformer架构问世以来&#xff0c;大模型领域的进展如火如荼&#xff0c;短短几年内&#xff0c;模型参数规模已攀升至天文数字&#xff0c;轻松跨过万亿门槛。面对如此庞然大物&#…

Comfyui 学习笔记3

ipadapter 用noise 增强画质 ipadapter 对每张图片的精准控制 对于一个 不是正方形的图形 作为ipadapter 可能丢弃下半身的风格&#xff0c;需要用ipadapter tile进行ipadapter 全身mask ipadapter advance weight_type 构图和风格迁移 构图迁移&#xff1a;左边什么 右面…

千万不要运行!几个可以整蛊你朋友的Python程序!

Python 能做很多无聊&#xff0c;但有意思的事情&#xff0c;例如接下来的一些案例。以下程序&#xff0c;不要发代码&#xff0c;要不实现不了你整蛊的目的。 要打包成一个 exe 程序&#xff0c;发给朋友才有意思&#xff0c;使用 pip install pyinstaller。 打包命令如下&a…

o1规划能力首测!已超越语言模型范畴,preview终于赢mini一回

克小西 发自 凹非寺 量子位 | 公众号 QbitAI o1-preview终于赢过了mini一次&#xff01; 亚利桑那州立大学的最新研究表明&#xff0c;o1-preview在规划任务上&#xff0c;表现显著优于o1-mini。 相比于传统模型的优势更是碾压级别&#xff0c;在超难任务上的准确率比Llama3.…

360° 镜头检测铝件内壁划痕与杂质:保障铝件内孔制造质量的精准方案

在铝件内孔制造的过程中&#xff0c;内壁的质量把控是至关重要的环节。制造过程中产生的碎屑残留以及划痕等问题&#xff0c;不仅会影响铝件的外观&#xff0c;更可能对其性能和使用寿命造成严重的损害。为了精准检测这些问题&#xff0c;我们提出了一套基于 360 镜头的检测方案…

金融科技革命:API接口开放平台,畅通金融服务之路

金融科技是近年来蓬勃发展的领域&#xff0c;它利用先进的技术手段来改善和创新金融服务。在金融科技的革命中&#xff0c;API接口开放平台扮演着重要的角色&#xff0c;它通过提供统一的接口服务&#xff0c;让金融机构和其他行业能够更方便地进行数据交换和合作。本文将以挖数…

高防服务器有用吗?租用价格一般多少

高防服务器有用吗&#xff1f;有用。高防服务器是一种具备高度防御能力的服务器&#xff0c;主要用于应对DDoS攻击、CC攻击等网络威胁。它通过专业的硬件设备和先进的防御算法&#xff0c;为用户提供持续、稳定的网络安全防护。高防服务器的主要特点包括强大的防御能力、低延迟…

跑步机的心声——N8900蓝牙音频芯片赋予智能健身新维度

国内健身器材市场年销售中跑步机占比超过一半&#xff0c;显示出其在健身器材领域的重要地位。国家卫生部门的公开讲话中提到&#xff0c;健康产业对国民经济的贡献具有无限前景&#xff0c;并强调了政府对健康产业的积极引导和支持。预计健康产业的产值将达到2万亿元以上&…

数据库操作:数据类型

1、数值类型 注&#xff1a;此图的最大值都要减1&#xff1b;因为我的错误&#xff0c;后面会改正&#xff1b; 1.0、tinyint 类型大小——1字节 create table tt1(num tinyint); insert into tt1 values(1); insert into tt1 values(128); -- 越界插入&#xff0c;报错 E…

第 19 章 说过的话就一定要办到——redo log

19.1 事先说明 不必理会 19.2 redo log 是个啥 我们想让已经提交了的事务对数据库中数据所做的修改永久生效&#xff0c;即使后来系统崩溃&#xff0c;在重启后也能把这种修改恢复出来&#xff0c;只需要把修改了哪些东西记录一下就好。这样也就满足了持久性的要求&#xff…

光控资本:什么是优质股,近期估值创历史新低的优质股盘点?

在股票商场中&#xff0c;选到优质股进行出资&#xff0c;可以让出资者取得更高的出资酬谢。美联储发布降息&#xff0c;关于A股商场而言&#xff0c;估值创新低的优质股或许将获益于美联储降息。 根据近期数据&#xff0c;归纳10家以上安排评级的个股中&#xff0c;有19只个股…

Oracle数据库体系结构基础

关于Oracle体系结构 基于Oracle11g体系结构 目标&#xff1a; 了解Oracle体系结构掌握逻辑存储结构掌握物理存储结构熟悉Oracle服务器结构熟悉常用的数据字典 Oracle数据库管理中的重要的三个概念 实例&#xff08;instance):实例是指一组Oracle后台进程以及在服务器中分配…

运行tensorflow报错InternalError: libdevice not found at ./libdevice.10.bc解决方法

运行tensorflow2.9.0的GPU报错 解决方法&#xff1a; 在项目目录下面新建2层文件夹nvvm/libdevice 解压cudatoolkit-11.2.0-h608a323_8.tar.bz2&#xff0c;然后复制"C:\Users<user_name>\anaconda3\pkgs\cudatoolkit-11.2.2-h933977f_10\DLLs" 里面文件 lib…

企业微信:开启客户联系和配置

前言 客户联系是企业微信的一项非常实用且自定义化配置丰富的功能&#xff0c;使企业内的授权员工可以添加外部客户&#xff08;企业微信联系人和微信联系人&#xff09;进行工作沟通&#xff0c;并且还可以建立客户群&#xff0c;甚至发表内容到客户朋友圈&#xff01; 由于功…

T536 工业级设备处理器:为智能硬件与工业应用打造的高性能解决方案

T536 工业级设备处理器&#xff1a;为智能硬件与工业应用打造的高性能解决方案 引言 在当今快速发展的科技时代&#xff0c;工业自动化和智能硬件领域对处理器的需求日益增长。为了满足这一需求&#xff0c;Allwinner Technology推出了T536系列处理器&#xff0c;这是一款专为…

解锁电商新趋势:探索循环购物模式的盈利与乐趣

亲爱的读者朋友们&#xff0c;今天我将向大家介绍一种新颖的电子商务模式——循环购物模式。你是否好奇&#xff0c;在某些购物平台上&#xff0c;消费1000元为何能获得超过2000元的价值回馈&#xff1f;并且每天还有额外的返现可以领取&#xff0c;这些钱还能轻松提现&#xf…

PCL 泊松重建

目录 一、概述二、代码三、结果 一、概述 PCL中的 pcl::Poisson<pcl::PointXYZRGBNormal>:函数实现泊松重建的代码示例。 二、代码 #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/io/ply_io.h> #include <pcl/point_types.h>…

Qt6.7开发安卓程序间接连接到MySQL的方法

本文主要描述一种通过间接的方法&#xff0c;使得Qt开发的安卓程序可以直连到Mysql数据库的方法。本文章的方案是通过JAVA代码去连接MySQL数据库&#xff0c;然后C代码去调用JAVA的方法&#xff0c;从而实现QT开发的安卓程序去直连到MySQL数据库。 本文使用 JDBC 结合 JNI&…