电梯模拟数据结构
时间: 2023-06-30 22:15:40 浏览: 73
电梯模拟可以用队列来实现。假设有n层楼,电梯在任何时刻都有可能停在其中一层,因此需要一个变量来记录电梯当前所在的楼层。同时,电梯需要记录它的运行状态,包括停止、上升、下降三种状态。因此,可以定义一个枚举类型来表示电梯的运行状态。
```c++
enum ElevatorStatus {
STOP,
UP,
DOWN
};
```
对于每一层楼,需要维护两个队列,分别表示等待上升和等待下降的乘客。当电梯到达一层楼时,需要判断该层楼是否有等待的乘客,如果有,将其加入电梯内部的队列中。当电梯停止时,需要将电梯内部的乘客按照目的楼层的顺序排列,以便决定下一步的运行方向。因此,可以定义一个结构体来表示乘客信息。
```c++
struct Passenger {
int id; // 乘客编号
int from; // 乘客当前所在楼层
int to; // 乘客的目的楼层
};
```
电梯内部的队列可以用一个vector来表示,每次添加新的乘客时,按照目的楼层的顺序插入队列中。电梯运行时,根据当前状态和队列中的乘客目的楼层,决定下一步运行的方向和停靠的楼层。当电梯到达某一层楼时,需要将该层楼的乘客加入电梯内部的队列中,然后按照目的楼层排序,以便决定下一步的运行方向。
以下是一个简单的电梯模拟程序的代码示例,仅供参考。
```c++
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// 定义乘客结构体
struct Passenger {
int id; // 乘客编号
int from; // 乘客当前所在楼层
int to; // 乘客的目的楼层
};
// 定义电梯状态枚举类型
enum ElevatorStatus {
STOP,
UP,
DOWN
};
// 电梯类
class Elevator {
public:
Elevator(int n) : currentFloor(1), status(STOP), maxFloor(n) {}
// 添加乘客
void addPassenger(const Passenger& p) {
passengers.push_back(p);
sort(passengers.begin(), passengers.end(), [](const Passenger& a, const Passenger& b) {
return a.to < b.to;
});
}
// 运行电梯
void run() {
while (true) {
if (passengers.empty() && waitUp.empty() && waitDown.empty()) { // 没有乘客等待,停止运行
status = STOP;
cout << "Elevator stops at floor " << currentFloor << endl;
break;
}
switch (status) {
case STOP: // 电梯停止状态
if (!passengers.empty()) { // 有乘客在电梯内,决定下一步运行方向
int nextFloor = passengers.front().to;
if (nextFloor > currentFloor) {
status = UP;
} else {
status = DOWN;
}
} else if (!waitUp.empty() && currentFloor <= waitUp.top()) { // 有等待上升的乘客
status = UP;
} else if (!waitDown.empty() && currentFloor >= waitDown.top()) { // 有等待下降的乘客
status = DOWN;
} else { // 没有乘客等待,停止运行
cout << "Elevator stops at floor " << currentFloor << endl;
break;
}
break;
case UP: // 电梯上升状态
cout << "Elevator goes up from floor " << currentFloor << endl;
currentFloor++;
if (currentFloor == maxFloor) { // 到达最高层,改为下降状态
status = DOWN;
}
for (auto it = passengers.begin(); it != passengers.end();) { // 电梯内的乘客下车
if (it->to == currentFloor) {
cout << "Passenger " << it->id << " gets off at floor " << currentFloor << endl;
it = passengers.erase(it);
} else {
++it;
}
}
while (!waitUp.empty() && waitUp.top() == currentFloor) { // 上升方向等待的乘客上电梯
Passenger p = { waitUp.top(), waitUp.top()+1, waitUp.size() };
waitUp.pop();
addPassenger(p);
cout << "Passenger " << p.id << " gets on at floor " << p.from << endl;
}
break;
case DOWN: // 电梯下降状态
cout << "Elevator goes down from floor " << currentFloor << endl;
currentFloor--;
if (currentFloor == 1) { // 到达最低层,改为上升状态
status = UP;
}
for (auto it = passengers.begin(); it != passengers.end();) { // 电梯内的乘客下车
if (it->to == currentFloor) {
cout << "Passenger " << it->id << " gets off at floor " << currentFloor << endl;
it = passengers.erase(it);
} else {
++it;
}
}
while (!waitDown.empty() && waitDown.top() == currentFloor) { // 下降方向等待的乘客上电梯
Passenger p = { waitDown.top(), waitDown.top()-1, waitUp.size() };
waitDown.pop();
addPassenger(p);
cout << "Passenger " << p.id << " gets on at floor " << p.from << endl;
}
break;
}
}
}
// 添加等待上升的乘客
void addWaitUp(int floor) {
waitUp.push(floor);
}
// 添加等待下降的乘客
void addWaitDown(int floor) {
waitDown.push(floor);
}
private:
int currentFloor; // 当前楼层
ElevatorStatus status; // 运行状态
int maxFloor; // 最高楼层
vector<Passenger> passengers; // 电梯内部乘客队列
priority_queue<int, vector<int>, greater<int>> waitUp; // 等待上升的乘客队列
priority_queue<int, vector<int>, less<int>> waitDown; // 等待下降的乘客队列
};
// 测试
int main() {
// 初始化电梯
Elevator elevator(10);
// 添加等待上升的乘客
elevator.addWaitUp(3);
elevator.addWaitUp(6);
elevator.addWaitUp(8);
// 添加等待下降的乘客
elevator.addWaitDown(5);
elevator.addWaitDown(9);
// 添加电梯内的乘客
Passenger p1 = { 1, 1, 5 };
Passenger p2 = { 2, 1, 9 };
Passenger p3 = { 3, 3, 8 };
elevator.addPassenger(p1);
elevator.addPassenger(p2);
elevator.addPassenger(p3);
// 运行电梯
elevator.run();
return 0;
}
```