队列的操作实验(数据结构)

news/2024/4/27 16:40:32/文章来源:https://blog.csdn.net/wkt1105436760/article/details/127237868

队列的操作实验(数据结构)

一、实验目的

1.掌握队列存储结构的表示和实现方法。
2.掌握队列的入队和出队等基本操作的算法实现。
3.了解队列在解决实际问题中的简单应用。

二、实验内容

1.建立顺序循环队列,并在顺序循环队列上实现入队、出队基本操作(验证性内容)。
2.建立循环链队列,并在循环链队列上实现入队、出队基本操作(设计性内容)。
3.实现键盘输入循环缓冲区问题(应用性设计内容)。

三、实验的软硬件环境要求

硬件环境要求:
PC机(单机) 使用的软件名称、版本号以及模块: Windows环境下的TurboC2.0以上或VC++

四、知识准备

前期要求熟练掌握了C语言的编程规则、方法和顺序循环队列、循环链队列的基本操作算法。

五、验证性实验

1.实验要求

编程实现如下功能:
(1)根据输入的队列长度n和各元素值建立一个循环顺序表表示的队列(循环队列),并输出队列中各元素值。
(2)将数据元素e入队,并输出入队后的队列中各元素值。
(3)将循环队列的队首元素出队,并输出出队元素的值和出队后队列中各元素值。

2. 实验相关原理:

队列是一种插入操作限制在表尾,而删除操作限制在表头进行的特殊线性表,它的操作具有“先进先出”的特性。采用顺序存储结构的队列称为顺序队列,顺序队列的存储结构描述如下:

#define MAXQSIZE 100/*顺序循环队列的最大长度*/typedef  struct
{ Qelemtype base[MAXQSIZE]; /*存放队列元素的数组空间*/
int front;  /*头指针,若队列不空,则指向队列头元素*/
int rear; /*尾指针,若队列不空,则指向队列尾元素的下一个存储单元*/}Sqqueue;

【核心算法提示】
1.顺序循环队列入队操作的基本步骤:首先判断队列是否为满,如果队列满,则函数返回ERROR,否则将待入队的数据元素e存放在尾指针rear所指示的存储单元中,再使尾指针沿着顺序循环存储空间后移一个位置,最后函数返回OK。
2.顺序循环队列出队操作的基本步骤:首先判断队列是否为空,如果队列空,则函数返回ERROR,否则将头指针所指示的队首元素用e返回其值,再使头指针沿着顺序循环存储空间后移一个位置,最后函数返回OK。
【核心算法描述】

status enqueue(Sqqueue &Q,Qelemtype e) 
/*在循环队列Q中,插入新元素使其成为队尾元素*/{  if ((Q.rear+1)%MAXQSIZE==Q.front)
return ERROR; /*若队列满,插入操作不能进行,函数返回ERROR*/Q.base[Q.rear]=e;  /*新元素成为队尾元素*/Q.rear=(Q.rear+1)%MAXQSIZE;/*利用模运算,“尾指针”加1,使尾指针后移一个位置*/return OK;}
status dequeue(Sqqueue &Q,Qelemtype &e)
/*在循环队列Q中,删除Q的队首元素*/{  if (Q.front==Q.rear)  
return ERROR;/*若队列空,删除操作不能进行,函数返回ERROR*/e=Q.base[Q.front];/*将队首元素用e保存其值*/Q.front=(Q.front+1)%MAXQSIZE;/*利用模运算,“头指针”加1,使头指针后移一个位置*/return OK;
}

3.源程序代码参考

#define MAXQSIZE 100
typedef struct{ int base[MAXQSIZE];int front;int rear;} Sqqueue;
Sqqueue enqueue(Sqqueue Q,int e)/*队列的入队函数*/{ if ((Q.rear+1)%MAXQSIZE==Q.front)printf("ERROR\n");else{Q.base[Q.rear]=e;Q.rear = (Q.rear+1)%MAXQSIZE;    //队尾指针+1}return Q;
}
Sqqueue dequeue(Sqqueue Q,int *e)/*队列的出队函数*/{  int x;if (Q.front==Q.rear)printf("ERROR\n ");else{ e=Q.base[Q.front];            //保存队头元素Q.front=(Q.front+1)%MAXQSIZE;//对头指针+1}return Q;}
void display(Sqqueue Q)/*队列元素输出函数*/{ int k,m;k=Q.front;m=Q.rear;while(k!=m){ printf("%4d",Q.base[k]);k=(k+1)%MAXQSIZE;}printf("\n");}
main()/*主函数*/{ Sqqueue Q;int i,n,x,y,e;Q.rear=Q.front=0; /*初始化顺序队列,使其成为空队列*/printf("\nplease input the length:");/*请求输入队列的长度*/scanf("%d",&n);printf("please input create data:\n  ");/*请求输入队列中各个元素*/for(i=1;i<=n;i++){scanf("%d",&x);Q=enqueue(Q,x);}/*调用队列插入函数*/printf("the queue is:\n");display(Q);/*调用队列元素输出函数*/printf("please input a insert data:");/*请求输入需要插入的元素*/scanf("%d",&y);Q=enqueue(Q,y);/*调用队列插入函数*/printf("the queue after insert is:\n");/*提示显示执行入队操作后的队列*/display(Q);/*调用队列元素输出函数*/Q=dequeue(Q,&e);/*调用队列删除函数*/printf("the delete data is:%d\n",e); /*显示被删的队首元素值*/printf("the queue after delete is:\n");/*提示显示执行出队操作后的队列*/display(Q);/*调用队列元素输出函数*/}

4.运行结果参考如图4-1所示:

在这里插入图片描述

                  图4-1: 验证性实验运行结果

六、设计性实验

1.编程实现对循环链队列的入队和出队操作。

⑴ 实验要求
①根据输入的队列长度n和各元素值建立一个带头结点的循环链表表示的队列(循环链队列),并且只设一个尾指针来指向尾结点,然后输出队列中各元素值。
②将数据元素e入队,并输出入队后的队列中各元素值。
③将循环链队列的队首元素出队,并输出出队元素的值和出队后队列中各元素值。
⑵ 核心算法分析
采用链式存储结构的队列称为链队列,链队列的存储结构描述如下:

typedef   struct  CQnode {
Qelemtype   data;/*数据域*/struct  CQnode  *next;/*指针域*/
}CQNODE,*CQLink;

如果队列中元素序列为{a1,a2,…,an},则带头结点的循环链队列的存储结构如下图4-1所示:
在这里插入图片描述

从图4-1可看出,队列的循环链式存储结构与循环单链表的存储结构相同,所有在循环链队列上进行入队和出队操作与单链表上的插入和删除操作的主要步骤相同。只不过要特别注意以下几点:
①此循环链队列是通过一个指向队尾结点的指针rear来标识的,则rear指向队尾元素结点,rear->next指向队头结点,而rear->nexnt->next指向队首元素结点。
②队列的入队操作是在链表的表尾(队尾)进行,而出队操作则在链表的表头(队首)进行。
③在出队操作时要注意:如果当链表中只有一个结点,即被删结点既是队首结点,又是队尾结点时,要进行尾指针的修改。
⑶ 核心算法描述

void InitCiQueue(CQLink  &rear)
/*初始化循环链表表示的队列rear,其中rear指向队尾元素*/
{ rear=(CQNODE*)malloc(sizeof(CQNODE)); /*产生一个头结点,并使队尾指针指向它*/
rear->next=rear;   /*形成循环*/
}

入队操作:

status  EnCiQueue(CQLink &rear,  int x)
/*把元素x插入到循环链表表示的队列rear中*/
{  p=(CQNODE*)malloc(sizeof(CQNODE));If 
p->data=x;           /*产生一个新结点p*/p->next=rear->next;   /*直接把p插入到rear的后面*/rear->next=p;rear=p;         /*修改尾指针,使p成为新的队尾结点*/
}
status DeCiQueue(CQLink &rear, int  &x)
/*从用队尾指针rear表示的循环链表删除一个队首元素,并用x返回其数据域的值。*/
{ if(rear==rear->next)  return ERROR;  /*如果队列为空,则函数返回ERROR*/p=rear->next->next;/*用p指针指向队首结点,也是待删结点*/x=p->data;   /* 用x保存待删队首结点的数据域的值*/rear->next->next=p->next;/*修改链,使p的后继成为新的队首结点*/if (rear==p) /*如果待删的结点p是队尾结点,则要使队尾指针指向原来队尾结点的后继(头结点)*/rear=rear->next;
free(p);    /*释放待删结点的空间*/return OK;
}

2.编程实现键盘输入循环缓冲区问题。

⑴ 实验要求
有两个进程同时存在于一个应用程序中。其中一个进程在屏幕上连续显示字符“A”,与此同时,程序不断检测键盘是否有输入,如果有的话,就读入用户链入的字符并保存到缓冲区中。在用户输入时,键入的字符并不立即回显在屏幕上。当用户键入一个逗号“,”时表示第一个进程结束,第二个进程从缓冲区中读取那些已键入的字符并显示在屏幕上。第二个进程结束后,程序又进入第一个进程,重新显示字符“A”,同时用户又可以继续键入字符,直到用户输入一个分号“;”键,才结束第一个进程,同时也结束整个进程。

⑵ 核心算法提示
在操作系统中,循环队列经常用于实时应用程序。例如,当程序正在执行其他任务时,用户可以从键盘上不断键入所要输入的内容。很多字处理软件就是这样工作的。系统在利用这种分时处理方法时,用户键入的内容不能在屏幕上立刻显示出来,直到当前正在工作的那个进程结束为止。但在这个进程执行时,系统是在不断地检查键盘状态,如果检测到用户键入了一个新的字符,就立刻把它存到系统缓冲区中,然后继续运行原来的进程。在当前工作的进程结束后,系统就从缓冲区中取出键入的字符,并按要求进行处理。所以,这里的键盘输入缓冲区可采用循环队列。队列保证了输入字符先输入、先保存、先处理的要求,循环结构又有效地限制了缓冲区的大小,并避免了假溢出问题。
在这里插入图片描述

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

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

相关文章

【LeetCode】【二叉搜索树迭代器】

173. 二叉搜索树迭代器 实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指…

【优化充电】基于matlab粒子群算法电动汽车充电动态优化策略【含Matlab源码 2163期】

一、粒子群算法电动汽车充电优化 1 电动汽车充电负荷估算 电动汽车的充电负荷主要与电动汽车起始充电时刻和充电时长相关,而起始充电时刻是由电动汽车用户的到家时间决定的,充电时长主要与电动汽车的行驶里程和充电倍率相关。 目前电动汽车还没有大规模运营, 只能通过统计燃油…

ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis

ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis 目录 ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis 项目创建 StackExchange.Redis操作示例 引包【using StackExchange.Redis;】 ConnectionMultiplexer RedisDBHelper …

Git学习总结

目录&#xff1a; &#xff08;1&#xff09;版本控制 &#xff08;2&#xff09;Git和SVN的区别 &#xff08;3&#xff09;Git历史 &#xff08;4&#xff09;安装Git及环境配置 &#xff08;5&#xff09;常用的Linux命令 &#xff08;6&#xff09;Git的必要配置 &a…

PMO和PM如何实现从战略解码到项目执行的端到端闭环?

一、PMO的使命与职责 PMO的使命是提升端到端组织效能&#xff0c;赋能于精细化管理&#xff0c;成为企业的加速器&#xff0c;保障战略项目的交付。 那么PMO要保障战略的交付&#xff0c;核心职责有哪些呢&#xff1f; 二、组织为什么需要端到端项目管理&#xff1f; 核心价…

【ZooKeeper】ZooKeeper 应用场景

ZooKeeper 应用场景发布订阅命名服务集群管理分布式锁分布式队列管理负载均衡配置管理ZooKeeper&#xff1a;分布式协调服务&#xff0c;仲裁机构。基于ZNode数据模型和Watcher监听机制可以解决很多问题&#xff0c;比如分布式锁问题。 应用场景如下&#xff1a; 1、发布/订阅 …

servlet基础知识

早期的Web应用主要用于浏览新闻等静态页面&#xff0c;HTTP服务器&#xff08;比如 Apache、Nginx&#xff09;向浏览器返回静态 HTML&#xff0c;浏览器负责解析HTML&#xff0c;将结果呈现给用户。随着互联网的发展&#xff0c;还希望进行一些交互操作来获取动态结果&#xf…

Python Turtle绘图基础(一)——Turtle简介、绘图窗体与绘图区域

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是Python Turtle绘图基础&#xff0c;包括Turtle简介、绘图窗体与绘图区域。 一、Turtle库简单介绍 Turtle库时Python语言的标准库&#xff08;所谓标准库&#xff0c;就是在安装Python时自带的库&#xff0c;与之…

【经典面试题-LeetCode69/剑指 Offer II 072:x 的平方根 (Python3实现)】

x 的平方根一、题目描述1.题目内容2.样例二、解决方案1.基本代码&#xff08;成功提交&#xff09;2.略微拓展一、题目描述 这是一道经典的面试题&#xff0c;需要我们在不使用任何内置函数的前提下&#xff0c;手动实现求指定整数的算术平方根。 1.题目内容 给你一个非负整数…

Android开发——底部导航栏设计

底部导航栏设计1.依赖配置2.tabbar的UI实现3.tabbar的逻辑绑定4.tabbar的滑动与点击联动其实,常见的Android和微信小程序一样&#xff0c;通常最下面一排需要有一排导航栏&#xff0c;可以通过点击导航栏图标和滑动实现页面跳转&#xff0c;具体实现使用的是Android的 ViewPage…

在MUI框架中对于事件绑定与取消和监听的触发自定义的深入运用与实战

事件绑定 除了使用addEventListener&#xff08;&#xff09;方法侦听特定元素上的事件外&#xff0c;还可以使用。on&#xff08;&#xff09;方法实现批元素的事件绑定。 event Type: String 需监听的事件名称&#xff0c;例如&#xff1a;‘tap’ selector Type: String 选择…

MySQL集群搭建——主从同步(一主二从)

一、安装MySQL数据库 Centos7安装MySQL5.7 目前准备了三台服务器作为主从配置数据库 #主 192.168.159.100:3306 #从 192.168.159.101:3306 #从 192.168.159.102:3306二、修改主数据库配置文件 vim /etc/my.cnf #在mysqld模块中添加如下配置信息 #开启二进制日志 log-binmast…

Win10家庭版利用Hyper-V虚拟机安装Kali Linux

目录 安装Hyper-V 批处理安装 重启电脑 下载Kali镜像 Kali官网下载 Hyper-V虚拟机 创建虚拟机 启动虚拟机 安装Kali 安装前配置 磁盘分区 系统安装 登录系统 近期学习网络安全的相关内容&#xff0c;需要用到很多的安全工具。偶然得知Kali Linux就是专门为网络安…

SD-WAN是面向分支机构的新兴、不断发展的解决方案

在过去的二十年里&#xff0c;人们的工作方式发生了很大变化。共享办公空间、移动性和云现在很常见。业务分散&#xff0c;分支机构得到授权。 当然&#xff0c;这个新功能是一件好事。但是&#xff0c;与此同时&#xff0c;它提出了一个巨大的挑战&#xff1a;多协议标签交换(…

【潮流计算】基于matlab粒子群算法优化电力系统潮流计算【含Matlab源码 2157期】

一、粒子群算法简介 1 标准粒子群优化(PSO)算法 PSO算法根据对环境的适应度将群体中的个体移动到好的区域,将每个个体看作是D维搜索空间中的一个粒子,根据粒子本身的飞行经验和群体中其他同伴的飞行经验调整下一步飞行方向,从而搜索到最好的空间位置解。设第i个粒子的位置表示…

什么是 IoT App SDK?

目录 为什么要开发 IoT App&#xff1f; IoT App SDK 的优势 IoT App SDK 分类 智能生活 App SDK 商用照明 App SDK 智慧社区 App SDK 智慧居住 App SDK 行业 App SDK 其他概念 IoT 设备 通信过程 IoT 云平台 智能面板 名词解释 涂鸦 IoT App SDK 是专为物联网移…

沉睡者IT:你理解的元宇宙是怎样呢?

这半年来关于元宇宙的话题成为了一场舆论的热点&#xff0c;很多即使是从事与其毫无相关职业的人&#xff0c;也多少有些耳闻。 ​ 编辑 但是对于元宇宙&#xff0c;它是什么&#xff0c;为什么需要元宇宙&#xff0c;怎样才能建立元宇宙以及大家对元宇宙的看法&#xff0c;…

Hack The Box靶机——Ambassador

文章目录前言一、Web部分二、提权部分前言 难度&#xff1a;中等&#xff0c;Hack The Box网站在线靶机。本文涉及知识点有&#xff1a;Grafana系统任意文件读取&#xff0c;CURL下载文件&#xff0c;SSL本地端口转发&#xff0c;Consul命令执行。 靶机地址&#xff1a;1…

【windows kernel源码分析】对初学者友好的底层理解,让你对计算机内核不再迷茫

文章目录&#x1f343;概念梳理windows kernel引导加载程序完成后的RAM内容&#x1f351;实现过程--还是看原文吧 &#x1f338;参考原文链接对市面上的文章再做一次整合。给渴望得到内核知识的人提供一些帮助。 &#x1f343;博主昵称&#xff1a;一拳必胜客 博主主页面链接&a…

各种平均值:算术平均值,几何平均值,调和平均值等

平均值概述 平均数反映了一组数据的一般水平&#xff0c;最常见的平均数是算术平均数&#xff0c;除了算数平均数外&#xff0c;还有几何平均数&#xff0c;调和平均数&#xff0c;加权平均数等。 算术平均值&#xff08;Arithmetic Mean&#xff09; 公式解读&#xff1a;表…