ZBLOG

使用c++顺序表或单链表,不用使用list容器代码实现 坪山新开了一家理发店,有10位托尼,编号为101至110,由于手艺非凡,顾客络绎不绝,为了高效为顾客服务,新增了电子排班表,规则如下: 初始状态为101至110,编号从小到大排列; 如果顾客没有熟悉的理发师,默认为顾客安排电子排班表第一位的理发师; 顾客可以指定想要的理发师,如果这位理发师有空则可以为顾客服务,如果没空则由排班表第一位服务。 当理发师完成了工作,将排到排班表的末尾。 让我们来实现电子排班表的功能吧! Input 第一行...

以下是使用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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9368

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?