顺序队列的基本操作的实现及舞伴问题

 

 

实验内容:   队列   

实验题目:  顺序队列的基本操作的实现及舞伴问题  

 

一、实验目的
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);   

 }

运行结果如下:

  • 10
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值