设有一个可以停放n 辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的先后次序依次从停车场最里面向大门口处停放 (即最先到达的第一辆车停放在停车场的最里面) 。如果停车场已放满n 辆车,则以后到达的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车可以进入停车场。停车场内如有某辆车要开走,则在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费,停留在便道上的车不收停车费。编写程序对该停车场进行管理。 输入数据时,先输入一个整数n(n<=10),再输入若干组数据,每组数据包括三个数据项:汽车到达或离开的信息(A 表示到达、D 表示离开、E 表示结束)、汽车号码、汽车到达或离开的时刻。当输入“E 0 0”时程序结束。 若有车辆到达,则输出该汽车的停车位置;若有车辆离开,则输出该汽车在停车场内停留的时间。以上用c语言编写程序。
时间: 2024-03-12 19:47:37 浏览: 81
好的,以下是用C语言编写的程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 10 // 停车场最大容量
#define MAX_CAR_NUM 1000 // 最大车牌号码数
typedef struct {
char number[8]; // 车牌号码
int time; // 到达或离开的时间
int status; // 状态:0 表示离开停车场,1 表示在停车场内,-1 表示在便道上等待
} Car;
Car cars[MAX_CAR_NUM]; // 所有车辆信息
int park[MAX_N]; // 停车场中的车辆编号
int top = -1; // 栈顶指针
int wait[MAX_CAR_NUM]; // 便道上等待的车辆编号
int front = 0; // 队首指针
int rear = 0; // 队尾指针
int cnt = 0; // 当前停车场中的车辆数
int find(char number[]) {
for (int i = 0; i <= top; i++) {
if (strcmp(cars[park[i]].number, number) == 0) {
return i;
}
}
return -1;
}
void arrival(char number[], int time) {
if (cnt < MAX_N) { // 停车场未满
top++;
park[top] = rear; // 把车停放在顶部
cnt++;
cars[rear].status = 1;
strcpy(cars[rear].number, number);
cars[rear].time = time;
printf("%d\n", top + 1); // 输出车辆的停车位置
rear = (rear + 1) % MAX_CAR_NUM;
} else { // 停车场已满,车辆进入便道
printf("停车场已满,%s将在便道上等待\n", number);
wait[rear] = rear; // 把车停放在队尾
cars[rear].status = -1;
strcpy(cars[rear].number, number);
cars[rear].time = time;
rear = (rear + 1) % MAX_CAR_NUM;
}
}
void leave(char number[], int time) {
int pos = find(number);
if (pos != -1) { // 停车场内有该车辆
int cost = (time - cars[park[pos]].time) * 1; // 计算停车费用
printf("%s 停留时间:%d,停车费用:%d\n", number, time - cars[park[pos]].time, cost);
cnt--; // 停车场中的车辆数减1
cars[park[pos]].status = 0;
for (int i = pos; i < top; i++) {
park[i] = park[i + 1]; // 把后面的车往前移动
}
top--;
if (cnt == MAX_N - 1 && front != rear) { // 如果便道上有车辆在等待,则让它进入停车场
top++;
park[top] = wait[front]; // 把车停放在顶部
cnt++;
cars[wait[front]].status = 1;
front = (front + 1) % MAX_CAR_NUM;
}
} else { // 停车场内没有该车辆,可能在便道上等待
for (int i = front; i != rear; i = (i + 1) % MAX_CAR_NUM) {
if (strcmp(cars[wait[i]].number, number) == 0) {
int cost = (time - cars[wait[i]].time) * 1; // 计算停车费用
printf("%s 停留时间:%d,停车费用:%d\n", number, time - cars[wait[i]].time, cost);
cnt--;
cars[wait[i]].status = 0;
for (int j = i; j != rear - 1; j = (j + 1) % MAX_CAR_NUM) {
wait[j] = wait[(j + 1) % MAX_CAR_NUM]; // 把后面的车往前移动
}
rear = (rear - 1 + MAX_CAR_NUM) % MAX_CAR_NUM;
if (cnt == MAX_N - 1 && front != rear) { // 如果便道上有车辆在等待,则让它进入停车场
top++;
park[top] = wait[front]; // 把车停放在顶部
cnt++;
cars[wait[front]].status = 1;
front = (front + 1) % MAX_CAR_NUM;
}
return;
}
}
printf("%s 没有停在停车场内\n", number);
}
}
int main() {
int n;
scanf("%d", &n);
char op[2], number[8];
int time;
while (1) {
scanf("%s", op);
if (op[0] == 'E') { // 结束程序
break;
}
scanf("%s %d", number, &time);
if (op[0] == 'A') { // 车辆到达
arrival(number, time);
} else if (op[0] == 'D') { // 车辆离开
leave(number, time);
}
}
return 0;
}
```
程序中使用了栈和队列两种数据结构,分别用来存储停车场中的车辆和便道上等待的车辆。栈用数组实现,队列用循环数组实现。程序根据输入的操作类型,分别调用 `arrival` 和 `leave` 函数来处理车辆到达和离开的情况。在 `arrival` 函数中,如果停车场未满,则把车停放在停车场的顶部;否则把车停放在便道上。在 `leave` 函数中,先在停车场中查找该车辆,如果找到则计算停车费用并把车从停车场中取走;如果没找到,则在便道上查找该车辆,如果找到则计算停车费用并把车从便道上取走。如果停车场中有空位,并且便道上有车辆等待,则把便道上的第一辆车放到停车场中。
阅读全文