试C语言编写程序,模拟上述管理过程。要求以顺序栈模拟停车场,以链队列模拟便道。
时间: 2023-06-01 20:02:18 浏览: 101
以下是该程序的代码:
```c
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 5 //停车场最大容量
//定义车辆结构体
typedef struct Car{
char num[10]; //车牌号
int time; //进入时间
}Car;
//定义顺序栈结构体
typedef struct Stack{
Car data[MAXSIZE];
int top;
}Stack;
//定义链队列结构体
typedef struct Node{
Car data;
struct Node* next;
}Node;
typedef struct Queue{
Node* front;
Node* rear;
}Queue;
//初始化顺序栈
void InitStack(Stack* s){
s->top = -1;
}
//判断顺序栈是否为空
int IsEmpty(Stack* s){
if(s->top == -1){
return 1;
}
else{
return 0;
}
}
//判断顺序栈是否已满
int IsFull(Stack* s){
if(s->top == MAXSIZE-1){
return 1;
}
else{
return 0;
}
}
//车辆入栈
int Push(Stack* s, Car c){
if(IsFull(s)){
printf("停车场已满,车辆无法进入!\n");
return 0;
}
else{
s->top++;
s->data[s->top] = c;
printf("车辆 %s 已进入停车场,停放在第 %d 个位置。\n", c.num, s->top+1);
return 1;
}
}
//车辆出栈
int Pop(Stack* s, Car* c){
if(IsEmpty(s)){
printf("停车场已空,无车辆出库!\n");
return 0;
}
else{
*c = s->data[s->top];
s->top--;
printf("车辆 %s 已从停车场出库,停放时间为 %d 分钟,停车费用为 %d 元。\n", c->num, 120-c->time, (120-c->time)/10);
return 1;
}
}
//初始化链队列
void InitQueue(Queue* q){
q->front = q->rear = (Node*)malloc(sizeof(Node));
q->front->next = NULL;
}
//判断链队列是否为空
int IsEmptyQueue(Queue* q){
if(q->front == q->rear){
return 1;
}
else{
return 0;
}
}
//车辆入队
void EnQueue(Queue* q, Car c){
Node* p = (Node*)malloc(sizeof(Node));
p->data = c;
p->next = NULL;
q->rear->next = p;
q->rear = p;
printf("车辆 %s 已进入便道排队,当前排队车辆数为 %d。\n", c.num, QueueLength(q));
}
//车辆出队
int DeQueue(Queue* q, Car* c){
if(IsEmptyQueue(q)){
printf("便道已空,无车辆出队!\n");
return 0;
}
else{
Node* p = q->front->next;
*c = p->data;
q->front->next = p->next;
if(q->rear == p){
q->rear = q->front;
}
free(p);
printf("车辆 %s 已从便道出队,进入停车场。\n", c->num);
return 1;
}
}
//获取链队列长度
int QueueLength(Queue* q){
int count = 0;
Node* p = q->front->next;
while(p != NULL){
count++;
p = p->next;
}
return count;
}
int main(){
Stack s;
Queue q;
InitStack(&s);
InitQueue(&q);
int op;
do{
printf("\n");
printf("停车场管理系统\n");
printf("1. 车辆进入停车场\n");
printf("2. 车辆从停车场出库\n");
printf("3. 显示当前停车场情况\n");
printf("4. 车辆进入便道排队\n");
printf("5. 车辆从便道出队进入停车场\n");
printf("6. 显示当前便道情况\n");
printf("0. 退出系统\n");
printf("请输入操作编号:");
scanf("%d", &op);
switch(op){
case 0:
printf("系统已退出!\n");
break;
case 1:
{
Car c;
printf("请输入车牌号:");
scanf("%s", c.num);
printf("请输入进入时间(分钟):");
scanf("%d", &c.time);
Push(&s, c);
break;
}
case 2:
{
Car c;
Pop(&s, &c);
break;
}
case 3:
{
if(IsEmpty(&s)){
printf("停车场已空!\n");
}
else{
printf("当前停车场情况如下:\n");
printf("位置\t车牌号\t进入时间\n");
for(int i=s.top; i>=0; i--){
printf("%d\t%s\t%d\n", i+1, s.data[i].num, s.data[i].time);
}
}
break;
}
case 4:
{
Car c;
printf("请输入车牌号:");
scanf("%s", c.num);
printf("请输入进入时间(分钟):");
scanf("%d", &c.time);
EnQueue(&q, c);
break;
}
case 5:
{
Car c;
DeQueue(&q, &c);
Push(&s, c);
break;
}
case 6:
{
if(IsEmptyQueue(&q)){
printf("便道已空!\n");
}
else{
printf("当前便道情况如下:\n");
printf("车牌号\t进入时间\n");
Node* p = q.front->next;
while(p != NULL){
printf("%s\t%d\n", p->data.num, p->data.time);
p = p->next;
}
printf("当前排队车辆数为 %d。\n", QueueLength(&q));
}
break;
}
default:
printf("输入有误,请重新输入!\n");
break;
}
}while(op != 0);
return 0;
}
```