隊列的基本操作應用---舞伴問題(數據結構實驗項目三)


實驗項目三:隊列的基本操作應用

課程名稱:數據結構

實驗目的:

1.掌握隊列的定義及實現;

2.掌握利用隊列的基本操作。

實驗要求:

1、    使用鏈式結構完成隊列的各種基本操作;

2、    補充完善教材81頁的舞伴問題。

實驗項目名稱:隊列的基本操作應用

實驗過程:

1、    先建立一個舞者隊列,依次往隊列中添加人員信息(8個人,5男3女);

2、    分別創建男女隊列;

3、    從舞者隊列中依次將隊首元素出隊並判斷其性別並添加至男隊(5人)或女隊(3人);

4、    分別從男隊和女隊出隊隊首元素並配對輸出;(男隊女隊分別3人)

5、    將未完成的一隊隊首元素輸出(男隊的隊首成員名稱)。

實驗報告中給出算法3.23的代碼

 

實驗結果:

輸入:8人信息(A,B,C,D,E,F,G,H)

輸出:The dancepartners:

A---B

      C---D

      E---F

G is waiting for a partner.

實驗分析:

1.隊列的操作特點;

2.列舉調試運行過程中出現的錯誤並分析原因。

要求:

(1) 程序要添加適當的注釋,程序的書寫要采用縮進格式。

(2) 程序要具在一定的健壯性,即當輸入數據非法時,程序也能適當地做出反應。

(3) 程序要做到界面友好,在程序運行時用戶可以根據相應的提示信息進行操作。

(4) 上傳源程序到課堂派。順序表的源程序保存為dancepartner.cpp。

程序代碼:

#include<stdio.h>
#define MAXQSIZE 100
#define QueueSize 20
#define OK 1
#define ERROR 0
#define OVERFLOW 0
#include <cstdlib>
#include<iostream>
using namespace std;
    
typedef char QElemType;
typedef int Status;
//typedef char SElemType;

typedef struct
{
    char name[QueueSize];
    char sex;
}person;

 
typedef struct
{
    person *dancer;
    person *base;       //存儲空間的基地址
    int front;             //頭指針
    int rear;              //尾指針 
}SqQueue; 

Status InitQueue(SqQueue &Q)
{//構造一個空隊列Q
    Q.base=new person[MAXQSIZE];    //為隊列分配一個最大容量為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)   //尾指針在循環意義上加1后等於頭指針,表明隊滿
        return ERROR;
    Q.base[Q.rear]=e;                //新元素插入隊尾
    Q.rear=(Q.rear+1)%MAXQSIZE;       //隊尾指針加1
    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;       //隊頭指針加1 
    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<<p.name<<" is waiting for a partner."<<endl;   
    }
    else if (!QueueEmpty(Mdancers))    //男士隊非空,輸出男士隊頭的姓名
    {
        p=GetHead(Mdancers);     // 取男隊的頭
        cout<<p.name<<" is waiting for a partner."<<endl;  
    }
     
 } 
 
int main()
 {
     int i,j;
     person dancer[QueueSize];
     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);
     
      
 }
 
 
 
 
 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM