看病排队候诊问题
医院各科室的医生有限,因此病人到医院看病时必须排队候诊,而病人的病情有轻重之分,不能简单的根据先来先服务的原则进行诊断治疗,所以医院根据病人的病情规定了不同的优先级别。医生在诊断治疗时,总是选择优先级别高的病人先治疗,如果遇到两个优先级别相同的病人,则选择最先来排队的病人进行诊治。
用队列模拟排队候诊
- 建立两个队列分别对应两个不同优先级别,按照从终端读入的输入数据的方式进行模拟管理
- 输入1,表示有新的病人加入队列候诊,根据病情指定其优先级别
- 输入2,表示医生根据优先级别为病人进行诊治
- 输入3,表示退出系统
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #include <stdio.h> #include <stdlib.h>
typedef struct { int id; int priority; } Patient;
typedef struct { Patient* data; int front; int rear; int maxSize; } Queue;
void initQueue(Queue* queue, int maxSize) { queue->data = (Patient*)malloc(maxSize * sizeof(Patient)); queue->front = -1; queue->rear = -1; queue->maxSize = maxSize; }
int isEmpty(Queue* queue) { return queue->front == -1; }
int isFull(Queue* queue) { return (queue->rear + 1) % queue->maxSize == queue->front; }
void enqueue(Queue* queue, Patient patient) { if (isFull(queue)) { printf("队列已满,无法插入新病人。\n"); return; }
if (isEmpty(queue)) { queue->front = 0; }
queue->rear = (queue->rear + 1) % queue->maxSize; queue->data[queue->rear] = patient; }
Patient dequeue(Queue* queue) { if (isEmpty(queue)) { printf("队列为空,无法删除病人。\n"); Patient emptyPatient = { -1, -1 }; return emptyPatient; }
Patient patient = queue->data[queue->front];
if (queue->front == queue->rear) { queue->front = -1; queue->rear = -1; } else { queue->front = (queue->front + 1) % queue->maxSize; }
return patient; }
Patient getFront(Queue* queue) { if (isEmpty(queue)) { printf("队列为空,无法获取队头病人。\n"); Patient emptyPatient = { -1, -1 }; return emptyPatient; }
return queue->data[queue->front]; }
int main() { int numPatients; printf("请输入病人数量:"); scanf("%d", &numPatients);
Queue queue; initQueue(&queue, numPatients);
for (int i = 0; i < numPatients; i++) { Patient patient; printf("请输入病人编号和优先级(用空格分隔):"); scanf("%d %d", &patient.id, &patient.priority); enqueue(&queue, patient); }
printf("开始诊治病人...\n");
while (!isEmpty(&queue)) { Patient patient = dequeue(&queue); printf("诊治病人:%d(优先级:%d)\n", patient.id, patient.priority); }
printf("所有病人已诊治完成。\n");
free(queue.data);
return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| 请输入病人数量:0 开始诊治病人... 所有病人已诊治完成。
请输入病人数量:3 请输入病人编号和优先级(用空格分隔):1 2 请输入病人编号和优先级(用空格分隔):3 1 请输入病人编号和优先级(用空格分隔):2 3 开始诊治病人... 诊治病人:1(优先级:2) 诊治病人:3(优先级:1) 诊治病人:2(优先级:3) 所有病人已诊治完成。
|