停车场管理系统

一.任务要求:
设有一个可以停放N(N>=5)辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满N辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在他之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆在依原来的次序进场。每辆车在离开停车场时,都应依据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制模拟该停车场的管理的程序。
二.关键:
在停车场内是一个停车队列,在等候区是一个等候队列,在里面的车要出来时,后面的车要先给他让路,出来之后后面的车再按原来的次序进入停车队列。
所以整个程序的关键就在于要建立一个停车队列,一个让路栈和一个等候队列。
三.使用的数据结构:链栈和链队列
四.具体代码实现:
//关键在于设置一个停放队列,让路栈,等候队列
//队列特点先进先出,栈特点现进后出
//使用链栈和链队列
#include <stdio.h>
#include <stdlib.h>
#define ok 1
#define error 0
#define OVERFLOW -1
#define N 5 //停车场可以容纳的车辆
#define price 0.5 //每分钟0.5元
typedef int status;
typedef float elemtype;
typedef struct Node{
status time; //按分钟计
status number; //车牌号
}Node;

typedef struct Queuenode{
Node data;
struct Queuenode *next;
}Queuenode,*QueuePtr; //队列结点

typedef struct Linkqueue{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue; //链队列

typedef struct Stacknode{
Node data;
struct Stacknode *next;
}Stacknode,*StackPtr; //栈结点

typedef struct Linkstack{
StackPtr top; //栈顶指针
status count; //可用来记录栈的大小
}LinkStack; //链栈

//接下来做一系列的函数列举出来
/* void menu(LinkQueue park,LinkStack giveaway,LinkQueue wait,status num,status t); //菜单
status enqueue(LinkQueue &Q,status num,status t); //入队
status dequeue(LinkQueue &Q,status &num,ststus &t); //出队
status check(LinkQueue Q); //查看队列长度
status park__(LinkQueue &park,LinkQueue &wait); //停车函数
status Init(LinkQueue &park,LinkStack &giveaway,LinkQueue &wait); //初始化
status push(LinkStack &S,status num,status t); //入栈
status pop(LinkStack &S,status &num,status &t); //出栈
status leave(LinkQueue &wait,LinkQueue &park,LinkStack &giveaway,status num,status t); //离开函数
status view(LinkQueue wait,LinkQueue park); //查看停车场状态
*/

status Init(LinkQueue &park,LinkStack &giveaway,LinkQueue &wait)
//初始化
{
QueuePtr newnode1;
newnode1 = (QueuePtr)malloc(sizeof(Queuenode));
if(!newnode1) exit(OVERFLOW);
newnode1->next=NULL;
wait.rear=wait.front=newnode1;
//等候队列
QueuePtr newnode2;
newnode2 = (QueuePtr)malloc(sizeof(Queuenode));
if(!newnode2) exit(OVERFLOW);
newnode2->next=NULL;
park.front=park.rear=newnode2;
//停放队列
StackPtr newnode3;
newnode3 = (StackPtr)malloc(sizeof(Stacknode));
if(!newnode3) exit(OVERFLOW);
newnode3->next=NULL;
giveaway.top=newnode3;
giveaway.count=0;
//让路栈
return ok;
}
status check(LinkQueue Q)
//查看当前长度,用i来带回长度
{
status i=0; //i相当于一个计数器来记队列当前长度,最后带回
while(Q.front!=Q.rear){
i=i+1;
Q.front=Q.front->next;
}
return i;
}
status enqueue(LinkQueue &Q,status num,status t)
//入队
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(Queuenode));
if(!p) exit(OVERFLOW);
p->data.number=num;
p->data.time=t;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return ok;
}
status dequeue(LinkQueue &Q,status &num,status &t)
//出队,队头作删除操作
{
if(Q.frontQ.rear)
return error; //空队列
QueuePtr p;
p=Q.front->next;
num=p->data.number;
t=p->data.time;
Q.front = p;
if(Q.rear
p)
Q.rear=Q.front;
free§;
return ok;
}
status push(LinkStack &S,QueuePtr a)
//入栈,在栈顶操作 ,把a结点里面的作为栈的新的栈顶元素
{
StackPtr p;
p=(StackPtr)malloc(sizeof(Stacknode));
if(!p) exit(OVERFLOW);
p->data.number=a->data.number;
p->data.time=a->data.time;
p->next=S.top->next;
S.top->next=p;
S.count=S.count+1;
return ok;
}
status pop(LinkStack &S,status &num,status &t)
//出栈,在栈顶操作
{
if(S.count0)
{ printf(“This stack is empty!”);
return error;
}
StackPtr p,q;
q=S.top;
p=S.top->next;
S.top=S.top->next;
num=p->data.number;
t=p->data.time;
S.count=S.count -1;
free(q);
return ok;
}
status park__(LinkQueue &park,LinkQueue &wait)
//停车函数
{
printf(“请输入车牌号和停车等候的时间:(车牌号不能有重复)”);
//停车等候的时间不计费
status num,t;
scanf("%d %d",&num,&t);
if(check(park)>=N)
{printf(“车库已满!请进入等候区!”);
enqueue(wait,num,t);}
else
enqueue(park,num,t);
}
status leave(LinkQueue &wait,LinkQueue &park,LinkStack &giveaway,status num,status t)
//有车离开,有两种情况,停车场内有车出,等候队列有车走
{
status a,b,t1;
QueuePtr p;
if(check(park)0) {printf(“停车场为空!无车可以离开!\n”); return ok;}
printf("**1.从停车场出车\t2.等候区有车离开\n");
printf(“请选择:”);
scanf("%d",&a);
/1.停车场出车,从停车队列出涉及让路栈的问题,一个车出,剩余的车要最后原来的顺序
再进入停车场。要出的车是停车队列的队首,从队尾车开始入栈,等要出的车走了后,就
出栈,就可以维持队列原来的顺序
2.等候队列有车走就直接从队首做删除操作
/
if(a
1){
printf(“要走的车的车牌号:”);
scanf("%d",&b);
p = park.front->next;
while§{
if(b
p->data.number) break;
p=p->next;
}//找这个要出来的车
if§{
push(giveaway, park.rear);//先把队尾的结点入栈
while(park.rear != p->next){
QueuePtr __t = p->next;
if(__t->next->data.number == park.rear->data.number)//说明是队尾指针的前一个结点
{
push(giveaway, __t);
park.rear = __t; //依次往前推
}else __t = __t->next;
}//要从队尾开始入栈,这样出栈的时候才可以再以原来的次序进入停车队列
push(giveaway,p->next);//说明已经到了队首的下一个(已是最后一个)

	printf("要付的钱是%.2f\n",p->data.time*price);
	free(p);	//就相当于是出队了 
	while(giveaway.count!=0)
	{	
		int number,time;
		pop(giveaway,number,time);
		printf("%d %d\n",number,time);
		enqueue(park,number,time);
	} 
	printf("已离开!\n"); 
  }
  else{
  	printf("查无此车!\n");
  	return error;
  }
}
else{
	if(check(park)<=N)
		printf("等候区无车!\n");
	else{
	dequeue(wait,num,t);
	printf("已离开!");
	} 
}
return ok;

}
status view(LinkQueue wait,LinkQueue park)
//查看停车场状况
{
int a;
printf(“当前停车场状况\n”);
printf(“当前停车场有%d个车位,停车场内有%d辆车,等候区有%d辆车\n”,N,check(park),check(wait));
printf("**************************\n");
printf(“是否要查看停车场内的车辆情况?请选择:(0代表是,1代表否):\n”);
scanf("%d",&a);
if(a==1){
printf(“查看结束!”);
return ok;
}
else{
QueuePtr head = park.front->next;
while(head != park.rear->next){
printf("\n");
printf(“车 号:%3d”,head->data.number);
printf("\n");
printf(“停车时间:%3d”,head->data.time);
head=head->next;
}
}
printf("\n");
return ok;
}
void menu(LinkQueue park,LinkStack giveaway,LinkQueue wait,status num,status t)
//菜单
{
printf(“Welcome to our Car Parking !\n”);
printf("********** Please choose function \n");
printf("
1.park \n");
printf("
2.leave \n");
printf("
3.view \n");
printf("
4.checklenth \n");
printf("
5.exit ****\n");
status option;
printf(“please choose:”);
scanf("%d",&option);
switch(option){
case 1:{
park__(park,wait);
printf(“停车完成!\n”);
menu(park,giveaway,wait,num,t);
break;
}
case 2:{
leave(wait,park,giveaway,num,t);
menu(park,giveaway,wait,num,t);
break;
}
case 3:{
view(wait,park);
menu(park,giveaway,wait,num,t);
break;
}
case 4:{
printf(“停车队列长度为%d\n”,check(park));
printf(“等候队列长度为%d\n”,check(wait));
menu(park,giveaway,wait,num,t);
break;
}
case 5:{
printf("***欢迎下次使用!
");
break;
}
default:{
printf("***请输入正确的指令!
");
menu(park,giveaway,wait,num,t);
break;
}
}
}
status main()
{
LinkQueue wait; //等候队列
LinkQueue park; //停车队列
LinkStack giveaway; //让路栈
status num=0,t=0;
Init(park,giveaway,wait);
menu(park,giveaway,wait,num,t);
return ok;
}

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值