⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fan.cpp

📁 这是一个停车场的模拟系统
💻 CPP
字号:
#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 100

struct car
{
	int num;
	int intime;
	int outtime;
};//停车场内的汽车
struct stack
{
	car *base;
	car *top;
	int stacksize;
};//车库
struct QNode
{
	car data;
	QNode* next;
};//通道上的汽车
struct Queue
{
	QNode *front;
	QNode *rear;
};//通道
void Input(car * car2 ,char x,int o)
{
    printf("车状态:%c\n",x);
	printf("汽车牌号:%d\n",car2->num);
	printf("汽车停留的时间(小时):%d\n",car2->outtime-car2->intime);
	printf("汽车收费:%d元\n",(car2->outtime-car2->intime)*o);
} 
int InitStack(stack &s)
{
	s.base=(car *)malloc (STACK_INIT_SIZE *sizeof(car));
	if(!s.base) exit(-1);
	s.top=s.base;
	s.stacksize=STACK_INIT_SIZE;
	return 1;
}//构造空栈
int Push(stack *s,car &car1)
{
	if(s->top-s->base >= s->stacksize)
		printf("车库已满,外面等待\n");
	*s->top++=car1;
	return 1;
}//进车库
int Pop(stack *s,car &car1)
{
	if(s->top==s->base) return ERROR;
	car1=*(--s->top);
	return OK;
}//出栈顶 

int OutPopIn(stack *s1, stack *s2,car *car2,car *car1,int i,int n)
{
	int m=n;
	for(;i<n;n--)
	{
		Pop(s1,*car1);
		Push(s2,*car1);//进入临时停车区

	}
	Pop(s1,*car2);
	for(;i<m;m--)
	{
		Pop(s2,*car1);
		Push(s1,*car1);//从临时停车区返回
	}
	return OK;
}//出栈的任意元素
int InitQueue(Queue &q)
{
	q.front=q.rear=(QNode *)malloc(sizeof(QNode));
	if(!q.front) exit(-1);
	q.front->next=NULL;
	return 1;
}//构造空队列

int EnQueue(Queue *q,QNode &car2)
{
	QNode *p;
	p=(QNode *)malloc(sizeof(QNode));
	if(!p) exit(OVERFLOW);
	*p=car2;
	p->next=NULL;
	q->rear->next=p;
	q->rear=p;
	return OK;
}//插入队列元素

int DeQueue(Queue *q,QNode &car1)
{
	QNode *p;
	if(q->front==q->rear) printf("待行区无车\n");
	else
	{
		p=q->front->next;
		car1=*p;
		q->front->next=p->next;
		if(q->rear==p)
			q->rear=q->front;
	}
	return OK;
}//出队列
int outQueue(Queue *q,QNode &car2,QNode &car1,int n,int m)
{
	int i;
	QNode *p;
	p=q->front->next;
	for(i=1;i<n;i++)
	{
		DeQueue(q,car1);
		EnQueue(q,car1);
	}
	DeQueue(q,car2);
	for(;i<m;i++)
	{
		DeQueue(q,car1);
		EnQueue(q,car1);
	}
	return OK;
}//出队列的任意元素

int main(void)
{
	stack s1,s2;//s1表示车库,s2表示临时车库
	Queue q3;//表示停车便道
	car car1,car2;
	QNode car3,car4;
	QNode *Q1;
	int d,o,c,e;
	char x,y;
	int n=0,m=1,a=0,b=0;
	InitStack(s1);//车库
	InitStack(s2);//等车区
	InitQueue(q3);//通道
	printf("********************************车库管理系统*****************************\n");
	printf("请输入车库的容量:");
	scanf("%d",&s1.stacksize);
	printf("请输入汽车收费单价:");
	scanf("%d",&o);
	while(1){
		printf("请输入汽车状态('A'表示到达,'D'表示离去,'E'表示输入结束):");
		scanf("%c",&x);
		if(x=='A')//进车
		{
			Q1=&car3;
			printf("请输入汽车牌号:");
			scanf("%d",&car3.data.num); 
			EnQueue(&q3,car3); 
			if(s1.top-s1.base<s1.stacksize) 
			{ 
				DeQueue(&q3,car4);
				printf("请输入该车进入车库的时间:");
				scanf("%d",&car4.data.intime);
				Push(&s1,car4.data);
				n=s1.top-s1.base;
				printf("车库停车位为:%d\n",n);
			}
			else if(s1.top-s1.base==s1.stacksize) 
			{ 
				c=a-b-s1.stacksize;
				m=c;
				printf("车库已满,外面等待,便道停车位为:%d\n",++m);
			}
			a++;
		}
		else if(x=='D')//出车
		{
			printf("车库中的车离开请输入S,待行区车离开请输入Q:");//为什么此处不能如此?
			scanf("%c",&y);
			if(y=='S')
			{
				if(s1.top==s1.base)
				printf("车库内无车\n");
				else
				{
					printf("要出车库的车的停车位:");
					scanf("%d",&d);
					if(s1.top-s1.base>d)
					{
						OutPopIn(&s1,&s2,&car2,&car1,d,s1.top-s1.base);
					    printf("请输入该车离开车库的时间:");
				    	scanf("%d",&car2.outtime);
					    Input(&car2,x,o);
					}
				    else
					{
					    Pop(&s1,car2);
				    	printf("请输入该车离开车库的时间:");
					    scanf("%d",&car2.outtime);
				    	Input(&car2,x,o);
					}
				    b++; 
				    if(q3.front!=q3.rear&&s1.top-s1.base<s1.stacksize)
					{ 
				    	DeQueue(&q3,car4);
				    	car4.data.intime=car2.outtime;
			     		printf("待行区一号车位进车库\n");
				    	printf("该车进入车库的时间为%d\n:",car4.data.intime);
				     	Push(&s1,car4.data);
					}
				}
			}
			else if(y=='Q')
			{
				if(q3.front==q3.rear)
				printf("待行区内无车\n");
				else
				{
					printf("请输入要离开待行区车的停车位:");
					scanf("%d",&e);
					if(e==1)
						DeQueue(&q3,car4);
					else
						outQueue(&q3,car4,car3,e,q3.front-q3.rear);
					printf("车已成功离开\n");
					b++;
				}
			}
		}
		else if(x=='E') break;
		else printf("请重新输入\n");
	}
	return(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -