数据结构的栈和队列及其应用,设计一个停车场管理系统

数据结构的栈和队列及其应用,设计一个停车场管理系统
  设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
2)
  以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表实现。
3)测试数据
设n=2,输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3, 20), (‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,其中,‘A’表示到达;‘D’表示离去,‘E’表示输入结
附加要求:汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。
小碟子 1年前 已收到1个回答 举报

wxyun 幼苗

共回答了12个问题采纳率:91.7% 举报

//停车场管理
#include "stdio.h"
#include"stdlib.h"
#include"string.h"
#define OK 1
#define ERROR 0
#define MAX_BUF 20//倒车辅组栈长度
#define MAX_NUM 6//停车场栈长度
#define RATE 5//停车场费率
#define MAXLEN 255//串的最大长度
#define MAX_TEST 100//测试车辆的最大数目
//typedef char SString[MAXLEN];
typedef struct
{//汽车状态,'A'为到达,'D'为离开,'E'为输入结束
char status; //汽车状态
int symbol;//车牌号码
int t;//到达或离去的时间
}DCar;
typedef struct
{//顺序栈
DCar *base,*top;
int stacksize;
}SqStack;
typedef struct QNode
{//队列结点
DCar data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{//链队列
QueuePtr front,rear;
}LinkQueue;
void InitStack(SqStack &S,int size)
{ //构造一个空停车场栈
S.top=S.base=(DCar*)malloc(size*sizeof(DCar));
S.stacksize=size;
}
int Push(SqStack &S,DCar e)
{//栈不满则入栈,否则返回错误
if(S.top-S.basenext=NULL;
Q.rear =Q.front ;
}
int EnQueue(LinkQueue &Q,DCar e)
{//入队
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)return ERROR;
p->data=e;p->next=NULL;
Q.rear->next =p;Q.rear=p;
return OK;
}
int DeQueue(LinkQueue &Q,DCar &e)
{//出队
QueuePtr p=Q.front->next ;//p指向队头元素
if(!p)return ERROR;//空队则返回错误
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
free(p);return OK;
}
void DestroyQueue(LinkQueue &Q){ //销毁队列
while(Q.front){
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear=NULL;
}
}
char Search(SqStack S,LinkQueue Q,int lisence)
{//根据车牌号查找要离开的车是在停车场(栈)还是在便道上(队列)
DCar *p=S.base;//设置栈中的搜索指针
QueuePtr q=Q.front->next;//链队列中的搜索指针
while(psymbol==lisence)
return 'S';//要离开的车在停车场(栈)
p++;
}
while(q){//在队列中搜索
if(q->data.symbol==lisence)
return 'Q';//要离开的车在便道上(队列)
q=q->next;
}
return 'N';//对应车牌的车没有,输入有误
}
int Charge(float stay)
{//根据停留的时间stay计算费用
//每小时RATE元,超过1小时不足2小时按2小时算,依次内推
return ((int)stay+1)*RATE;
}
int Arrive(SqStack &S,LinkQueue &Q,DCar c)
{//汽车到达处理函数
if(Push(S,c))//进入停车场成功
{
printf("n时间%d:%d号车进入停车场n",c.t,c.symbol);
return OK;
}
if(EnQueue(Q,c))return OK;//进入便道成功
return ERROR;
//printf("nche%dn",S.top-S.base);
}
void Depart(SqStack &S,LinkQueue &Q,DCar c)
{//汽车c离开处理函数
char locate;
locate=Search(S,Q,c.symbol);//确定要离开车的位置
SqStack Sbuf;//规避所栈
QueuePtr p;
DCar e;
int stay;
InitStack(Sbuf,MAX_BUF);
switch(locate)
{
case 'S'://汽车c在停车场(栈内)
while((S.top-1)->symbol!=c.symbol)
{//在汽车c后面进入的车依次倒车
Pop(S,e);//退出停车场
Push(Sbuf,e);//进入规避所
}
Pop(S,e);//汽车c离开
stay=c.t-e.t;//计算停留时间
printf("n%d号车离开,停留时间%d,费用:%d",c.symbol,stay,stay*RATE);
printf("n");
while(Sbuf.base!=Sbuf.top)
{//按原来次序再进入停车场
Pop(Sbuf,e);Push(S,e);
}
if(Q.front!=Q.rear)
{//如果便道上有车(队列非空)则第一辆车进入停车场
DeQueue(Q,e);
e.t=c.t;//开始计时收费
Push(S,e);
printf("n%d号车进入停车场,时间:%cn",e.t,e.symbol);
}
break;
case 'Q'://汽车c在便道上(队列中)
p=Q.front->next;//指向队头结点
while(p->data.symbol==c.symbol)
{//将汽车c前面的车开进规避所
DeQueue(Q,e);Push(Sbuf,e);//进入规避所
p=Q.front->next;
}
DeQueue(Q,e);//汽车c离开
printf("n%d号车未进停车场离开,不收费!",e.symbol);
printf("n");
while(Sbuf.top!=Sbuf.base)
{//进入规避所的车按原来次序返回到便道上(队列)
Pop(Sbuf,e);
p=(QueuePtr)malloc(sizeof(QNode));
p->data=e;
p->next=Q.front->next;//插入到队头,注意:不是入队操作
Q.front->next=p;
}
break;
case 'N':printf("n%d车辆信息错误!n",c.symbol);break;
}
free(Sbuf.base );
}
int main(){
DCar car[MAX_TEST]={{'A',1,5},{'A',2,10},{'D',1,15},{'A',3, 20}, {'A',4,25},{'A',5,30},{'D',2,35},{'D',4,40},{'E',0,0}};
SqStack S;
LinkQueue Q;
InitStack(S,MAX_NUM);
InitQueue(Q);
for(int i=0;car[i].status!='E';i++)
{
if(car[i].status=='A')Arrive(S,Q,car[i]);
else Depart(S,Q,car[i]);
}
DestroyQueue(Q);
free(S.base);//销毁栈
return 0;
}

1年前

4
可能相似的问题
Copyright © 2024 YULUCN.COM - 雨露学习互助 - 16 q. 0.027 s. - webmaster@yulucn.com