C程序模拟停车场管理问题

问题描述:
         设停车场内只有一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停 车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车 停放在车场的最北端),若车场内已停满 n 辆汽车,则后来的汽车只能在门外的便道上等候, 一旦有车开走,则排在便道上的第一辆车即可开入,当停车场内某辆车要离开时,在它之后开 入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每 辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上 述要求进行管理的模拟程序。
基本要求:
          以栈模拟停车场,以队模拟停车场外的便道,按照从终端读入的输入数据序列进行模拟管 理。每一组输入数据包括三个数据项:汽车 “ 到达 ” 和 “ 离去 ” 信息、汽车牌照号码及到达和离去的 时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或 便道上停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道 上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。
实现提示:
         须另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序结构实 现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车 的照牌号码和进入停车场的时刻。

//2010.05.21 FJC
//队首可开走
#include<stdio.h>
#include<malloc.h>
#define maxsize 2
typedef int datatype;      //队列开始
typedef struct node
{
	datatype data;
	struct node *next;
}linklist;
typedef struct
{linklist *front,*rear;
}linkqueue;
linkqueue *creat(q)
linkqueue *q;
{q->front=(linklist*)malloc(sizeof(linklist));
 q->front->next=NULL;
 q->rear=q->front;
 return q;
}
int isnull(q)
linkqueue *q;
{if(q->front==q->rear)
    return 1;
 else
	 return 0;
}
linkqueue *enqueue(q,x)
linkqueue *q;                 
datatype x;
{
	q->rear->next=(linklist*)malloc(sizeof(linklist));
	q->rear=q->rear->next;
	q->rear->data=x;
	q->rear->next=NULL;
	return q;
}
datatype dequeue(q)
linkqueue *q;
{
	linklist *s;
	if(isnull(q))
	{printf("queue is empty!\n");
	 return NULL;
	}
	else
	{s=q->front;
	 q->front=q->front->next;
	 free(s);
	 return(q->front->data);
	}
} 
datatype headqueue(q)
linkqueue *q;
{
	linklist *s;
	if(isnull(q))
	{return NULL;
	}
	else
	{return(q->front->next->data);//注意头结点
	}
} 
int dequeue2(q,x)
linkqueue *q;
datatype x;
{
	linklist*s;
	s=q->front;
	while(s->data!=x)
	{
	}
}
//队列结束
typedef struct
{
	datatype data;
	datatype time;
}stackdata;
typedef struct
{
    stackdata data[maxsize];
    int top;
}stack;
stack* creatstack()
{stack *s;
 s=(stack*)malloc(sizeof(stack));
 s->top=-1;
 return s;
}
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;
}
void push(stack *s,datatype x,datatype y)
{if(isfull(s))
     printf("overflow!\n");
 else
 {
	 s->top++;
     s->data[s->top].data=x;
	 s->data[s->top].time=y;
 }
}
void push2(stack *s,stackdata data)
{
	 s->top++;
     s->data[s->top]=data;
}
stackdata pop(stack *s)
{if(isempty(s));
 else
 {s->top--;
  return(s->data[s->top+1]);
 }
}
datatype top(stack *s)
{if(!isempty(s))
    {return (s->data[s->top].data);}
return NULL;
}
int execute(que,s1,s2,sign,x,y)
linklist *que;
stack *s1,*s2;
char sign;
datatype x;
datatype y;
{
	datatype t,t1;
	stackdata data;
	datatype dat;
	if(sign=='A')
	{if(!isfull(s1))
	{push(s1,x,y);
	 printf("%d车于%d时进入停车场\n",x,y);
	}
	 else
	 {enqueue(que,x);
	  printf("%d车于%d时在便道上停车\n",x,y);}
	}
	if(sign=='B')
	{
	  if(headqueue(que)==x)
	  {
			   dequeue(que);
			   printf("便道上的车%d于%d时开走\n",x,y);
			   return 1;
	  }
		if(isempty(s1))
		{printf("停车场内无车辆!\n");}
		else
		{
           while(x!=top(s1)&&s1->top!=-1)
		   {data=pop(s1);
	        push2(s2,data);
		   }
		  if(s1->top==-1)
		  {printf("无此车辆!\n");
		   return 0;
		  }
     	  t1=pop(s1).time;
	      t=y-t1;
		  if(t>=0)
		  {printf("%d车于%d时开出停车场,共用时%d\n",x,y,t);
    	   while(!isempty(s2))
		   {data=pop(s2);
	        push2(s1,data);
		   }
	       if(!isnull(que))
		   { dat=dequeue(que);
	         push(s1,dat,y);
	       	 printf("%d车于%d时进入停车场\n",dat,y);
		   }
		  }
		  else
		  {printf("输入有误!\n");
		   push(s1,x,t1);
		   return 0;
		  }
		}
	}
	return 1;
}
void main()
{
	char ch;
	datatype data,time;
	linkqueue *que=(linkqueue*)malloc(sizeof(linkqueue));
	stack *s1,*s2;
	que=creat(que);
	s1=creatstack();
	s2=creatstack();
	printf("                           ******停车场管理模拟系统******\n");
	printf("请输入车辆信息:\n");
	printf("汽车到达或离去信息:\n");
	ch=getchar();
	while(ch!='E')
	{printf("输入车号及到达时间(整数,空格分开):\n");
	 scanf("%d%d",&data,&time);
	 execute(que,s1,s2,ch,data,time);
	 ch=getchar();//接收空格
	 printf("汽车到达或离去信息:\n");
	 ch=getchar();
	}
	printf("程序结束\n");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值