實驗項目三:隊列的基本操作應用
課程名稱:數據結構
實驗目的:
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); }