看病排队候诊问题

医院各科室的医生有限,因此病人到医院看病时必须排队候诊,而病人的病情有轻重之分,不能简单的根据先来先服务的原则进行诊断治疗,所以医院根据病人的病情规定了不同的优先级别。医生在诊断治疗时,总是选择优先级别高的病人先治疗,如果遇到两个优先级别相同的病人,则选择最先来排队的病人进行诊治。

用队列模拟排队候诊

  • 建立两个队列分别对应两个不同优先级别,按照从终端读入的输入数据的方式进行模拟管理
  • 输入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)
所有病人已诊治完成。