1. 程式人生 > >【資料結構】佇列的應用-看病排隊候診問題

【資料結構】佇列的應用-看病排隊候診問題

看病排隊候診問題        

醫院各科室的醫生有限,病人到醫院看病時必須排隊就診,而病人病情有輕重之分,不能簡單地根據先來先服務的原則進行診斷治療,所以醫院根據病人的病情規定了不同的優先級別。醫生在診斷治療時,總是選擇優先級別高的病人進行診治,如果遇到兩個優先級別相同的病人,則選擇優先來排隊的病人進行診治。

基本要求:    

(1)用佇列模擬上述病人看病排隊候診問題;      

(2)兩個佇列分別對應不同的優先級別,優先順序高的佇列中的病人優先就診;      

(3)按照從終端讀入數的方式進行模擬管理。

測試資料要求:

  病人資訊包括:掛號編號、病歷號、看病的優先順序、姓名和性別。

 

病人類定義:

過載輸入:1、提示詞形式輸入     2、文字形式輸入

typedef struct Patient{
    string Rt_No,Ce_No,Name,Sex;
    bool Prior;
    Patient(string R="0000",
            string C="0000",
            string N="He",
            string S="boy",
            bool P=false )
    :Rt_No(R),Ce_No(C),Name(N),Sex(S),Prior(P){}

    friend  istream  &operator>>(istream &is,Patient &pat){
        puts("Regist\tcase\tPrior\tname\tsex");
        is>>pat.Rt_No>>pat.Ce_No>>pat.Prior>>pat.Name>>pat.Sex;
        if(!is) pat=Patient();
        return is;
    }

    int Cin(){
        puts("掛號編號 Registration number :");cin>>Rt_No;
        puts("病歷號 Case number :");         cin>>Ce_No;
        puts("看病的優先順序 Priority ");      cin>>Prior;
        puts("姓名 name");                  cin>>Name;
        puts("性別 sex");                  cin>>Sex;
    }

}QElemType;

佇列元素:

過載輸出運算子:

typedef struct QNode{
    QElemType data;
    struct QNode *next;
    QNode (QElemType Data=t,struct QNode *Next=NULL){
        data=Data;next=Next;
    }
    friend ostream & operator<<(ostream &os,const QNode &Q){
        os<<Q.data.Rt_No<<"\t"<<Q.data.Ce_No<<"\t"<<
        (Q.data.Prior?"H":"L")<<"\t"<<Q.data.Name<<"\t"
        <<Q.data.Sex<<endl;
    }
}QNode , *QueuePtr;

插入函式:

void EnQueue(LinkQueue &Q,QElemType e){
    QueuePtr s=new QNode(e,NULL),L,R;
    if(QueueEmpty(Q)){
        Q.Front->next=s;
        Q.Rear=s;   return ;
    }
    L=Q.Front,R=L->next;
    for(; L->next;L=L->next){
        R=L->next;
        if(R->data.Ce_No>e.Ce_No)
            break;
    }
    R=L->next;
    s->next=R;
    L->next=s;
    if(R==NULL){
        Q.Rear=s;
    }
    //Q.Rear->next=s;
    //Q.Rear=s;
}

完整的除錯程式碼:

#include<string>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef struct Patient{
    string Rt_No,Ce_No,Name,Sex;
    bool Prior;
    Patient(string R="0000",
            string C="0000",
            string N="He",
            string S="boy",
            bool P=false )
    :Rt_No(R),Ce_No(C),Name(N),Sex(S),Prior(P){}

    friend  istream  &operator>>(istream &is,Patient &pat){
        puts("Regist\tcase\tPrior\tname\tsex");
        is>>pat.Rt_No>>pat.Ce_No>>pat.Prior>>pat.Name>>pat.Sex;
        if(!is) pat=Patient();
        return is;
    }

    int Cin(){
        puts("掛號編號 Registration number :");cin>>Rt_No;
        puts("病歷號 Case number :");         cin>>Ce_No;
        puts("看病的優先順序 Priority ");      cin>>Prior;
        puts("姓名 name");                  cin>>Name;
        puts("性別 sex");                  cin>>Sex;
    }

}QElemType;
QElemType t={"000000","000000","He","boy",false};
typedef struct QNode{
    QElemType data;
    struct QNode *next;
    QNode (QElemType Data=t,struct QNode *Next=NULL){
        data=Data;next=Next;
    }
    friend ostream & operator<<(ostream &os,const QNode &Q){
        os<<Q.data.Rt_No<<"\t"<<Q.data.Ce_No<<"\t"<<
        (Q.data.Prior?"H":"L")<<"\t"<<Q.data.Name<<"\t"
        <<Q.data.Sex<<endl;
    }
}QNode , *QueuePtr;
typedef struct {
    QueuePtr Front,Rear;
}LinkQueue;
void InitQueue(LinkQueue &Q){
    Q.Front=new QNode ;
    Q.Rear=Q.Front;
    Q.Front->next=NULL;
}
void ClearQueue(LinkQueue &Q){
    QueuePtr p,s;
    p=Q.Front->next;
    Q.Front->next=NULL;
    while(p){
        s=p;p=p->next;
        delete s;
    }
    Q.Rear=Q.Front;
}
bool QueueEmpty(LinkQueue Q){
    return Q.Front==Q.Rear?true:false;
}
int QueueLength(LinkQueue Q){
    int len=0;
    QueuePtr p=Q.Front->next;
    while(p){
        len++;p=p->next;
    }
    return len;
}
void EnQueue(LinkQueue &Q,QElemType e){
    QueuePtr s=new QNode(e,NULL),L,R;
    if(QueueEmpty(Q)){
        Q.Front->next=s;
        Q.Rear=s;   return ;
    }
    L=Q.Front,R=L->next;
    for(; L->next;L=L->next){
        R=L->next;
        if(R->data.Ce_No>e.Ce_No)
            break;
    }
    R=L->next;
    s->next=R;
    L->next=s;
    if(R==NULL){
        Q.Rear=s;
    }
    //Q.Rear->next=s;
    //Q.Rear=s;
}
void DeQueue(LinkQueue &Q,QElemType &e){
    if(QueueEmpty(Q)){
        puts("error !!! queue is empty !!!");return ;
    }
    QueuePtr s=Q.Front->next;
    Q.Front->next=s->next;
    e=s->data;
    if(Q.Rear==s){
        Q.Rear=Q.Front;
    }
    delete s;
}
void GetHead(LinkQueue Q,QElemType &e){
    if(QueueEmpty(Q)){
        puts("error !!! queue is empty !!!");return ;
    }
    e=Q.Front->next->data;
}
void QueueTraverse(LinkQueue Q){
    puts("Regist\tcase\tPrior\tname\tsex");
    for(QueuePtr p=Q.Front->next;p;p=p->next){
        cout<<*p<<endl;
    }
}
void Warning(bool Pattern=false,int No=-1,int n=-1){
    if(!Pattern){
        puts("");return ;
    }else if(No!=-1&&n==-3){
        printf("請輸入第%d位病人的資訊:\n",No);
    }else if(No==0&&n==-2){
        printf("請輸入n的值:(n位病人)\n");
    }else if(No==1){
        printf("請依次輸入%d位病人的資訊:\n",n);
    }else if(No==2){
        printf("\n\n病情較為嚴重的,共有%d人,分別為:\n",n);
    }else if(No==3){
        printf("\n\n病情較為輕微的,共有%d人,分別為:\n",n);
    }
}

int main()
{
    int n;
    bool Pattern = false;
    Warning(Pattern,0,-2);
    cin>>n;
    QElemType pat;
    LinkQueue QH,QL;
    InitQueue(QH),InitQueue(QL);
    Warning(Pattern,1,n);
    for(int i=0;i<n;i++){
        Warning(Pattern,i+1,-3);
        //cin>>pat.Rt_No>>pat.Ce_No>>pat.Prior>>pat.Name>>pat.Sex;
        if(Pattern)
            pat.Cin();
        else
            cin>>pat;
        EnQueue((pat.Prior?QH:QL),pat);
    }
    Warning(Pattern,2,QueueLength(QH));
    QueueTraverse(QH);
    Warning(Pattern,3,QueueLength(QL));
    QueueTraverse(QL);
}
/*
6
0004    0012    1       張三      男
0002    0002    0       李四      女
0005    0007    1       王五      男
0001    0015    0       佳麗      女
0008    0011    1       龍九      男
0002    0010    0       小倩      女
*/