定义一个包含学生信息(学号,姓名,成绩)的链式队列,使其具有如下功能: (1) 初始化一个空队列; (2) 逐个输入学生信息并入队; (3) 出队,输出学号、姓名、成绩等信息; (4) 删除队列。 (5) 统计当前队列排队学生个数; (6) 请设计一个类似于买火车票的绿色通道功能,并简要叙述该功能对队列的影响。
时间: 2023-05-27 09:03:48 浏览: 99
1.链式队列的定义
链式队列的每个节点包含学生信息,其结构体如下:
```
struct Student {
int id; // 学号
string name; // 姓名
int score; // 成绩
Student *next; // 指向下一个节点的指针
};
```
链式队列包含一个头节点和一个尾节点,其结构体如下:
```
struct LinkedQueue {
Student *front; // 指向头节点的指针
Student *rear; // 指向尾节点的指针
int size; // 当前队列的大小
};
```
2.初始化一个空队列
初始化一个空队列只需将头节点和尾节点指针均指向 NULL,队列大小为 0 即可。
```
LinkedQueue *initQueue() {
LinkedQueue *que = new LinkedQueue;
que->front = NULL;
que->rear = NULL;
que->size = 0;
return que;
}
```
3.逐个输入学生信息并入队
将一个学生信息打包成一个节点,通过 rear 指针将其入队,并更新队列大小。
```
void enqueue(LinkedQueue *que, int id, string name, int score) {
Student *stu = new Student;
stu->id = id;
stu->name = name;
stu->score = score;
stu->next = NULL;
if (que->rear == NULL) {
que->front = stu;
que->rear = stu;
} else {
que->rear->next = stu;
que->rear = stu;
}
que->size++;
}
```
4.出队,输出学号、姓名、成绩等信息
从 front 指针指向的节点出队,并更新队列大小;若队列为空,则输出提示信息。
```
void dequeue(LinkedQueue *que) {
if (que->front == NULL) {
cout << "队列为空" << endl;
return;
}
Student *p = que->front;
que->front = p->next;
cout << "学号:" << p->id << ",姓名:" << p->name << ",成绩:" << p->score << endl;
delete p;
que->size--;
}
```
5.删除队列
从头节点开始依次释放每个节点的空间,并将头尾指针指向 NULL,队列大小为 0。
```
void deleteQueue(LinkedQueue *que) {
Student *p = que->front;
while (p != NULL) {
Student *tmp = p;
p = p->next;
delete tmp;
}
que->front = NULL;
que->rear = NULL;
que->size = 0;
}
```
6.统计当前队列排队学生个数
直接返回队列的大小即可。
```
int getSize(LinkedQueue *que) {
return que->size;
}
```
7.类似于买火车票的绿色通道功能
买火车票的绿色通道功能是为了方便老人、孕妇、儿童等特殊人群购买火车票而设置的优先购票通道。我们可以设计一个类似的功能,为特定条件的学生设置优先入队通道。
例如,我们可以针对运动员、奖学金获得者、拥有特殊文艺才华(例如画画、弹琴等)的学生设置绿色通道。他们可直接插入队头,优先入队。
```
void greenChannel(LinkedQueue *que, Student *stu) {
if (stu->score >= 90 || stu->id % 2 == 0 || stu->name == "leo") { // 可以添加自定义的优先条件
if (que->front == NULL) {
que->front = stu;
que->rear = stu;
stu->next = NULL;
}
else {
stu->next = que->front;
que->front = stu;
}
que->size++;
} else {
enqueue(que, stu->id, stu->name, stu->score);
}
}
```
该功能对队列的影响主要体现在队列的结构变化上。由于优先入队的节点会插入到队头,因此会影响队列中已有节点与队头节点之间的结构。如果优先入队的节点数量过多,也会导致队列的结构变得复杂。因此,在设计绿色通道功能时,需要权衡优先入队和队列结构复杂程度之间的关系。