首页 > 其他分享 >数据结构:实验四:队列的操作

数据结构:实验四:队列的操作

时间:2024-04-06 19:59:31浏览次数:26  
标签:return 队列 SqQueue int 实验 front 数据结构 rear

一、实验目的

  1. 领会队列的存储结构特点
  2. 掌握环形队列中的各种基本运算算法设计
  3. 熟悉利用队列解决实际问题

二、实验要求

实现环形队列的定义,头文件命名”SqQueue.h”。 利用所定义的环形队列,设计一个算法实现下面问题的求解:

问题描述:设有n个人站成一排,从左向右的编号分别为1—n,现在从左往右报数“1,2,1,2,…数到“1”的人出列,数到“2”的立即站到队伍的最右端。报数过程反复进行,直到n个人出列为止。要求给出他们的出列顺序。

算法思想提示:先将n个人的编号进队,然后反复执行以下操作,直到队列为空。

(1)出队一个元素,输出其编号(报数为1 的人出列)。

(2)若队列不空,再出队一个元素,并将刚出列的元素进队(报数为2的人站到队伍的最右端,即队尾)。

三、实验环境

Windows+DEV C++( 或者其他编译工具)

四、实验步骤及结果 

1. 环形队列结点类型声明

typedef int ElemType;

typedef struct

{

   ElemType data[MaxSize];     //存放队中元素

   int front,rear;             //队头和队尾指针

} SqQueue;

2.队列基本运算在环形队上的实现

//初始化队列

void InitQueue(SqQueue *&q)

{

   q=(SqQueue *)malloc(sizeof(SqQueue));

   q->front=q->rear=-1;

}

//判队列是否为空

bool QueueEmpty(SqQueue *q)

{

   return (q->front==q->rear);

}

//进队

bool enQueue(SqQueue *&q,ElemType e)

{

   if(q->rear==MaxSize-1)//队满上溢出

       return false;

   q->rear++;

   q->data[q->rear] = e;

   return true;

}

//出队

bool deQueue(SqQueue *&q,ElemType &e)

{

   if(q->front==q->rear)//队空下溢出

       return false;

   q->front++;

   e=q->data[q->front];

   return true;

}

//销毁队列

void DestroyQueue(SqQueue *&q)

{

   free(q);

}

//报数

void number(int n)

{

   int i;

   int count=1;      //count用来记第几个元素

   SqQueue *q;          //环形队列指针q

   InitQueue(q);     //初始化队列q

   for(i=1; i<=n; i++) //构建初始序列

   {

       enQueue(q,i);

   }

   while(!QueueEmpty(q)) //队列不空循环

   {

       deQueue(q,i);

       if(count%2==0)           //第偶数个元素时,进队

          enQueue(q,i);

       else

          printf("%d\t",i); //第奇数个元素时,出队输出

       count++;

   }

   printf("\n");

   DestroyQueue(q);

}

SqQueue.h:

#include<stdio.h>
#include<malloc.h>
#define MaxSize 100
typedef int ElemType;
typedef struct 
{
	ElemType data[MaxSize];		//存放队中元素
	int front,rear;				//队头和队尾指针
} SqQueue;
//初始化队列
void InitQueue(SqQueue *&q) 
{
	q=(SqQueue *)malloc(sizeof(SqQueue));
	q->front=q->rear=-1;
}
//判队列是否为空
bool QueueEmpty(SqQueue *q) 
{
	return (q->front==q->rear);
}
//进队
bool enQueue(SqQueue *&q,ElemType e) 
{
	if(q->rear==MaxSize-1)//队满上溢出 
		return false;
	q->rear++;
	q->data[q->rear] = e;
	return true;
}
//出队
bool deQueue(SqQueue *&q,ElemType &e) 
{
	if(q->front==q->rear)//队空下溢出 
		return false;
	q->front++;
	e=q->data[q->front];
	return true;
}
//销毁队列
void DestroyQueue(SqQueue *&q) 
{
	free(q);
}
//报数
void number(int n) 
{
	int i;
	int count=1;		//count用来记第几个元素
	SqQueue *q;			//环形队列指针q 
	InitQueue(q);		//初始化队列q 
	for(i=1; i<=n; i++) //构建初始序列 
	{
		enQueue(q,i);
	}
	while(!QueueEmpty(q)) //队列不空循环 
	{
		deQueue(q,i);
		if(count%2==0)			//第偶数个元素时,进队
			enQueue(q,i);
		else
			printf("%d\t",i);	//第奇数个元素时,出队输出
		count++;
	}
	printf("\n");
	DestroyQueue(q);
}

3. 编写程序exp3-2.cpp,实现上述问题的求解

#include"SqQueue.h"

int main()

{

   int n;

   printf("请输入n的个数:");

   scanf("%d",&n);

   number(n);

   return 0;

}

4.实验结果截图

标签:return,队列,SqQueue,int,实验,front,数据结构,rear
From: https://blog.csdn.net/m0_65216733/article/details/137436484

相关文章

  • OSPF中配置静态路由负载分担实验简述
    OSPF中配置静态路由负载分担实验简述在静态路由负载分担中,多个路由器被配置为共享负载的目标,以实现流量的均衡分配。到达目的地有N条相同度量值的路径,默认值60,N条路由是等价路由,数据报文在N条链路上轮流发送。静态路由负载分担的优点是简单易用,不需要额外的负载均衡设备......
  • 实验报告4
    项目一解题思路1.getchar赋值ch2.if函数限制范围3.ch+6确定且用putchar输出核心代码#include<stdio.h>intmain(){printf("06杨雪辉\n");charch;ch=getchar();if(ch<'A'||ch>'Z')printf("输入错误");else{ if(ch>='U') ......
  • C++数据结构与算法——回溯算法组合问题
    C++第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更新,欢迎关注!文章目录一、77.组合二、216.组合总和III三、17.电话号码的字......
  • 【数据结构与算法】:直接插入排序和希尔排序
    1.排序的概念及其意义1.1排序的概念所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。1.2排序的稳定性假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[......
  • Java数据结构队列
    队列(Queue) 概念队列的使用注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。importjava.util.LinkedList;importjava.util.Queue;publicclassTest{publicstaticvoidmain(String[]args){Queue<Integ......
  • 实验报告3
    项目一解题思路1.用char函数定义字符2.scanf函数输入三个字母3.用a-32表示对应的大写字母核心代码#include<stdio.h>intmain(){chara,b,c;scanf("%c,%c,%c",&a,&b,&c);printf("%c的ASCII值:%d大写字母:%c\n",a,a,a-32);printf("%c的ASCII值:%d大写字母:%c......
  • 数据结构之顺序表的相关知识点及应用
     个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客目录顺序表的概念及结构顺序表的分类顺序表的实现 在顺序表中增加数据 在顺序表中删除数据 在顺序表中查找数据 顺序表源码 顺序表的概念及结构在了解顺序表之前,得先知道......
  • C113 带修莫队 P1903 [国家集训队] 数颜色/维护队列
    视频链接:   LuoguP1903[国家集训队]数颜色/维护队列//带修莫队O(n^(5/3))#include<iostream>#include<cstring>#include<algorithm>#include<cmath>usingnamespacestd;constintN=1000005;intn,m,B,mq,mr,a[N];intsum,cnt[N],ans[N];st......
  • (数据结构——比特)算法的时间复杂度和空间复杂度
    目录1.算法效率如何衡量一个算法的好坏算法的复杂度复杂度在校招中的考察2.时间复杂度时间复杂度的概念 请计算一下Func1中++count语句总共执行了多少次?Func1执行的基本操作次数: 大O的渐进表示法推导大O阶方法:使用大O的渐进表示法以后,Func1的时间复杂度为: 另......
  • 操作系统综合题之“银行家算法,计算还需要资源数量和可用资源梳理和写出安全队列和银行
    一、设系统中有三种类型资源A、B、C,资源数量分别为15、7、18,系统有五个进程P1、P2、P3、P4、P5,其最大资源需求量分别为(5,4,9)、(4,3,5)、(3,0,5)、(5,2,5)、(4,2,4)。在T0时刻,系统为个进程已经分配的资源数量分别为(2,1,2)、(3,0,2)、(3,0,4)、(2,0,4)、(3,1,4)。若系统采用银行家算法实施死锁避免策略......