实验内容: 队列
实验题目: 顺序队列的基本操作的实现及舞伴问题
一、实验目的
1.深入了解队列的定义和特性。
2.掌握队列的数组表示、链表表示以及相应操作的实现,巩固对这两种结构的构造方法的掌握。
3. 会灵活运用队列结构解决某些实际问题。
二、实验内容
1. 顺序队列的基本操作的实现(初始化、赋值、取值、插入、删除等)。
2. 链队列的基本操作的实现(初始化、赋值、取值、插入、删除等)。
3. 舞伴问题(参加教材相关描述)。
三、实验要求
1. 前两个题目任选其一,第3题必做。
2. 在本题下面提交源程序和实验运行结果截图。
3. 上交纸质实验报告和电子版实验报告。
1、顺序队列
#include<stdio.h>
#include<process.h>
#include<malloc.h>
#define MAXSIZE 100
#define OK 1
#define OVERFLOW 0
#define ERROR -1
typedef int QElemType;
typedef int SElemType;
typedef int Status;
typedef struct
{
QElemType *base;
int front,rear;
}SqQueue;
Status InitQueue(SqQueue &Q)
{//构造一个空队列Q
Q.base=new QElemType[MAXSIZE];
if(!Q.base) exit(OVERFLOW);
Q.front=Q.rear=0;
return OK;
}
int QueueLength(SqQueue Q)
{//返回Q的元素个数,即Q的长度
return(Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
Status EnQueue(SqQueue &Q,QElemType e)
{//插入元素e为Q的新队尾元素
if((Q.rear+1)%MAXSIZE==Q.front)
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;
return OK;
}
Status DeQueue(SqQueue &Q,QElemType &e)
{//删除Q的队头元素,用e返回其值
if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return OK;
}
SElemType GetHead(SqQueue Q)
{//返回Q的队头元素,不修改Q的队头指针
if(Q.rear!=Q.front)
return Q.base[Q.front];
}
Status QueueEmpty(SqQueue &Q)
{//判断Q是否为空
if(Q.rear == Q.front)
return OK;
else
return ERROR;
}
Status QueueTraverse(SqQueue Q)
{//遍历队列Q
int i;
for(i=0;i<QueueLength(Q);i++)
printf("%d ",Q.base[i]);
return OK;
}
Status ClearQueue(SqQueue Q)
{//清除Q中的元素
Q.front=Q.rear;
return OK;
}
Status DestroyQueue(SqQueue &Q)
{//销毁队列
free(Q.base);
return OK;
}
int main()
{
QElemType e;
SqQueue Q;
InitQueue(Q);
printf("构造队列成功!!!\n");
printf("入队列的元素是1 2 3 4 5\n");
EnQueue(Q,1);
EnQueue(Q,2);
EnQueue(Q,3);
EnQueue(Q,4);
EnQueue(Q,5);
printf("队列的长度是:%d\n",QueueLength(Q));
printf("队列中的元素是:\n");
QueueTraverse(Q);
printf("\n删除Q的队头元素:%d\n",DeQueue(Q,e));
printf("现在队列中的首元素是:%d\n",GetHead(Q));
printf("清空队列Q!!!\n");
ClearQueue(Q);
if(!QueueEmpty(Q)==0)
printf("队列现在为空!!!\n");
DestroyQueue(Q);
printf("销毁队列成功!!!");
return OK;
}
运行结果:
2 .舞伴问题
#include<stdio.h>
#define MAXQSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#include <cstdlib>
#include<iostream>
using namespace std;
typedef char QElemType;
typedef int Status;
typedef struct
{
char name[20];
char sex;
}person;
typedef struct
{
person *dancer;
person *base;
int front;
int rear;
}SqQueue;
Status InitQueue(SqQueue &Q)
{//构造一个空队列Q
Q.base=new person[MAXQSIZE];
if(!Q.base) exit(OVERFLOW);
Q.front=Q.rear=0;
return OK;
}
Status EnQueue(SqQueue &Q,person e)
{//插入元素e为Q的新的队尾元素
if((Q.rear+1)%MAXQSIZE==Q.front)
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
}
int QueueEmpty(SqQueue &Q)
{//判断队列是否为空
if (Q.front==Q.rear) return OK;
else
return ERROR;
}
Status DeQueue(SqQueue &Q,person &e)
{//删除Q的队头元素,用e返回其值
if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
}
person GetHead(SqQueue Q)
{//返回Q的队列元素,不修改队头指针
if(Q.front!=Q.rear)
return Q.base[Q.front];
}
void DancePartner(person dancer[],int num)
{//结构数组dancer中存放跳舞的男女,num是跳舞的人数
person p;
int i;
SqQueue Mdancers,Fdancers;
InitQueue(Mdancers);
InitQueue(Fdancers);
for (i=0;i<num;i++)
{
p=dancer[i];
if (p.sex=='F') EnQueue(Fdancers,p);
else EnQueue(Mdancers,p);
}
cout<<"The dancing partner are:\n";
while(!QueueEmpty(Fdancers)&&!QueueEmpty(Mdancers))
{//依次输出男女舞伴的姓名
DeQueue(Fdancers,p);
cout<<p.name<<" ";
DeQueue(Mdancers,p);
cout<<p.name<<endl;
}
if (!QueueEmpty(Fdancers))
{
p=GetHead(Fdancers);
cout<<"The first man to get a partner is."<<p.name<<endl;
}
else if (!QueueEmpty(Mdancers))
{
p=GetHead(Mdancers);
cout<<"The first woman to get a partner is."<<p.name<<endl;
}
}
int main()
{
int i,j;
person dancer[20];
cout<<"请输入跳舞的人数:";
cin>>j;
while(j<=0)
{
cout<<"输入错误,请重新输入跳舞的人数:";
cin>>j;
}
for(i=1;i<=j;i++)
{
cout<<"请输入第"<<i<<"舞者的名字:"<<endl;
cin>>dancer[i-1].name;
cout<<"请输入第"<<i<<"个人的性别(F/M):"<<endl;
cin>>dancer[i-1].sex;
while(dancer[i-1].sex!='F'&&dancer[i-1].sex!='M')
{
cout<<"*******输入错误,请重新输入:\n";
cout<<dancer[i-1].sex;
cout<<"请输入第"<<i<<"个人的性别(F/M):"<<endl;
cin>>dancer[i-1].sex;
break;
}
}
DancePartner(dancer,j);
}
运行结果如下: