以下是使用C++顺序表和单链表实现电子排班表功能的示例代码:
#include <iostream>
#include <vector>
// 定义理发师结构体
struct Barber {
int number;
bool available; // 是否有空闲时间
};
// 使用顺序表实现排班表
class ScheduleList {
private:
std::vector<Barber> barbers;
public:
ScheduleList() {
for (int i = 101; i <= 110; i++) {
Barber barber;
barber.number = i;
barber.available = true;
barbers.push_back(barber);
}
}
// 获取排班表中第一个可用的理发师编号
int getFirstAvailableBarber() const {
for (const auto& barber : barbers) {
if (barber.available) {
return barber.number;
}
}
return -1; // 没有可用的理发师,返回-1表示错误
}
// 将指定理发师添加到排班表末尾
void addBarberToSchedule(int barberNumber) {
for (auto& barber : barbers) {
if (barber.number == barberNumber) {
barber.available = false; // 设置为不可用
break;
}
}
}
// 将指定理发师移动到排班表末尾(工作完成)
void moveBarberToEnd(int barberNumber) {
for (auto& barber : barbers) {
if (barber.number == barberNumber) {
barber.available = true; // 设置为可用(工作完成)
break;
}
}
}
// 打印排班表中的理发师编号
void printSchedule() const {
for (const auto& barber : barbers) {
std::cout << barber.number << "-";
}
std::cout << std::endl;
}
};
// 使用单链表实现顾客队列
class CustomerQueue {
private:
struct Node {
int customerId;
int assignedBarber; // 0表示未指定,其他值表示指定的理发师编号
Node* next;
explicit Node(int id, int barber = 0) : customerId(id), assignedBarber(barber), next(nullptr) {}
};
Node* head;
public:
CustomerQueue() : head(nullptr) {}
// 添加顾客到队列末尾
void enqueue(int customerId, int assignedBarber = 0) {
if (!head) { // 队列为空,创建头结点
head = new Node(customerId, assignedBarber);
return;
}
Node* currNode = head;
while (currNode->next) { // 找到队列末尾节点
currNode = currNode->next;
}
currNode->next = new Node(customerId, assignedBarber); // 创建新节点并连接到末尾
}
// 将第一个顾客从队列中移除并返回其编号
int dequeue() {
if (!head) { // 队列为空,返回错误值-1
return -1;
}
Node* firstNode = head;
int customerId = firstNode->customerId;
int assignedBarber = firstNode->assignedBarber;
head = firstNode->next; // 更新头结点
delete firstNode; // 释放内存
return assignedBarber == 0 ? customerId : assignedBarber;
}
// 打印队列中的顾客编号
void printQueue() const {
Node* currNode = head;
while (currNode) {
std::cout << currNode->customerId << "-";
currNode = currNode->next;
}
std::cout << std::endl;
}
};
int main() {
int n;
std::cin >> n;
ScheduleList scheduleList;
CustomerQueue customerQueue;
for (int i = 0; i < n; i++) {
std::string operation;
int barberNumber;
std::cin >> operation;
if (operation == "assign") { // 安排理发师
std::cin >> barberNumber;
if (barberNumber == 0) { // 如果未指定理发师,从排班表中获取第一个可用的理发师
barberNumber = scheduleList.getFirstAvailableBarber();
}
customerQueue.enqueue(i + 1, barberNumber); // 将顾客添加到队列中,记录操作次数作为顾客编号
if (barberNumber != -1) { // 理发师存在且有空闲时间,将其从排班表移除
scheduleList.moveBarberToEnd(barberNumber);
}
} else if (operation == "finish") { // 理发师完成工作
std::cin >> barberNumber;
if (barberNumber >= 101 && barberNumber <= 110) {
scheduleList.addBarberToSchedule(barberNumber);
}
}
}
scheduleList.printSchedule(); // 打印排班表最终状态
while (!customerQueue.empty()) { // 打印每次操作后队列中的顾客编号
customerQueue.printQueue();
customerQueue.dequeue();
}
return 0;
}
这段代码使用了顺序表(std::vector)实现排班表,单链表实现顾客队列。你可以根据输入进行测试,看看输出结果是否符合预期。
内容由零声教学AI助手提供,问题来源于学员提问




