停车场项目 停放栈 让路栈 等候队列


停车场项目需求


问题描述:停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门
                 外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车
 要先退出,待它走后在依次进入。汽车离开时按停放时间收费。
基本功能要求:
               (1)建立三个数据结构分别是:停放栈、让路栈、等候队列。
               (2)输入数据模拟管理过程,数据(入或出,车号)


功能描述:进车登记、出车登记、按车牌号查询停车车辆信息、查询出入车记录、
                查询场内车辆信息、查询等候车辆信息、退出系统。
          (1)linux系统编写(链表、栈、队列);
          (2)进车登记:登记车牌号以及入场时间;
          (3)出车登记:计算出停车时间,记录车辆车牌;
          (4)按车牌号查询车辆信息:停车时间,是否来过停车场,是否还在停车场
          (5)查询出入记录:所有车辆,包括已经离开的
          (6)查询场内车辆信息:列出所有场内车辆信息
          (7)查询等候车辆信息:显示等候车辆数量以及所有车牌号

          (8)退出系统。


#include <stdio.h>

#include<stdlib.h>
#include<time.h>
#include <string.h>
#include<math.h>
#define Status int
#define MAX 5      //停车容量
#define PRICE 2.0    //停车收费标准:元/每小时
#define TRUE 1
#define FALSE 0


typedef struct car
{
char name[10];    //车牌号
struct tm intime;   //入库时间
struct tm outtime;       //出库时间
int expense;          //停车费用
int length;           //停车时间
int position;     //车位
}Car;         // 车位信息


typedef struct stack
{
Car num[MAX];
int top;
}Stack;         //顺序栈


typedef struct node
{
Car data;
struct node * next;
}Node,* LinkPtr;


typedef struct
{
LinkPtr front;
LinkPtr rear;
}LinkQueue;      //链队列


Status InitStack(Stack *S)   //初始化栈
{

S->top= - 1;
return TRUE;
}


Status StackEmpty(Stack S)  //判断栈是否为空
{
if(- 1 == S.top)
{
return TRUE;
}
else
{
return FALSE;
}
}


Status StackFull(Stack S)     //判断栈是否为满
{
if(S.top == MAX - 1)
{
return TRUE;
}
else
{
return FALSE;
}
}


Status PushStack(Stack *S,Car e)   //入栈
{
if(!StackFull(*S))
{
S->top++;
S->num[S->top]=e;
return TRUE;


}
return FALSE;
}






 Car PopStack(Stack *S)         //出栈
{
Car p;
if(!StackEmpty(*S))
{
p=S->num[S->top];
S->top--;
return p;


}

}


Status InitLinkQueue(LinkQueue * Q)       //链队列的初始化
{
(Q->front)=(Q->rear)=(LinkPtr)malloc(sizeof(Node));
if(NULL == Q->front)
{

exit(OVERFLOW);
}
Q->front->next=NULL;
return TRUE;


}


Status LinkQueueEmpty(LinkQueue Q)  //判断队列是否为空
{
if(Q.front ==Q.rear)
{
return TRUE;
}
return FALSE;
}


Status PushLinkQueue(LinkQueue *Q,Car e)   //入队列
{
LinkPtr p;
p=(LinkPtr)malloc(sizeof(Node));
if(NULL == p)
{
exit(OVERFLOW);
}
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
return TRUE;
 
}


Car PopLinkQueue(LinkQueue *Q)    //出队列
{
LinkPtr p;
Car lcar;
if(Q->front== Q->rear)
{
printf("等候队列为空");


}
p=Q->front->next;
lcar=p->data;
Q->front->next=p->next;
if(Q->rear==p)
{
Q->rear=Q->front;
free(p);
}
return lcar;


}


int Printfdata(struct tm gm)      //显示时间:月 日 几点几分几秒
{
printf("%d/%d%3d:%2d:%2d \n",gm.tm_mon+ 1,gm.tm_mday,gm.tm_hour+8,gm.tm_min,gm.tm_sec);
return 0;
}


Status ShowStack(Stack S)    //查看车位车辆
{
int i;
printf("*********************************************");
printf("车位使用情况\n");
if(StackEmpty(S))
{
printf("停车场内没有车辆\n");


}
else
{
printf("位置\t车牌号\t进站时间\n");
for(i=0;i<=S.top;i++)
{
printf("%d\t",S.num[i].position);
printf("%s\t",S.num[i].name);
Printfdata(S.num[i].intime);
}
printf("\t\t\t共%d辆车!",S.top + 1);
if(S.top == MAX - 1)
{
printf("(已满)\n");
}
else
{
printf("还可以停放%d辆车\n",MAX - 1 - S.top);


}
}
printf("**************************************");
getchar();
return TRUE;
}


Status ShowLinkQueue(LinkQueue Q) //查看便道上的车辆
{
int i,count=0;
LinkPtr p;
p=Q.front->next;


printf("***************************************");
printf("便道使用情况:\n");
if(LinkQueueEmpty(Q))
{
printf("便道上没有车\n");
}


while(NULL != p)
{
printf("车牌号\t 进场时间\n");
printf("%s\t ",p->data.name);
Printfdata(p->data.intime);
p=p->next;
count++;


}
printf("便道上有 %d   辆车在等候\n",count);
printf("**************************************\n");


return TRUE;
}










Status Reach(Stack *S,LinkQueue *Q,LinkQueue *L)   //入库
{
Car car;
struct tm * gm; 
time_t It;    
time(&It);      /*time_t time(time_t * timer)  得到机器的日历时间*/
gm=gmtime(&It);    /* struct tm *  gmtime(time_t * time)  得到以结构tm表示的时间信息*/
car.intime=*gm;
printf("输入车牌号:");
scanf("%s",car.name);
if(!StackFull(*S) && LinkQueueEmpty(*Q) )    //入停车栈
{
car.position=(S->top) + 2;
PushStack(S,car);
ShowStack(*S);

}
else if(StackFull(*S) || !LinkQueueEmpty(*Q))    //车满,入等候队列
{
printf("提示:车位满,只有先停放在便道上!\n");
car.position=MAX;
PushLinkQueue(Q,car);

}
printf("按回车键继续..\n");
getchar();
Menu(*S,*Q,*L);
return TRUE;


}


Status Printfrate(Car * car)   //打印账单


{
printf("********************************************");
printf("账单\n");
printf("车牌号:%s\n",car->name);
printf("停车位置:%d\n",car->position);
printf("进入时间:");
Printfdata(car->intime);
printf("离开时间:");
Printfdata(car->outtime);
printf("停车时间(秒):%d\n",car->length);
printf("费用(元):%d\n",car->expense);
printf("********************************************");
printf("按回车键继续");
getchar();
return TRUE;
}


Status  Leave_s(Stack *S,LinkQueue *Q,LinkQueue *L)   //离开车库
{
struct tm *gm;
time_t Lt;
Stack  p;
InitStack(&p);
Car car,lcar;
int i;
int pos;
if(StackEmpty(*S))
{
printf("所有车位是空的,没有车辆需要离开!\n");
}
else
{
printf("现在车位使用情况!\n");
ShowStack(*S);
printf("哪个车位的车辆需要离开:");
scanf("%d",&pos);
getchar();
if(pos>0 && pos<=S->top + 1)
{
for(i=S->top + 1;i> pos;i --)    //该车位后面的车需要入让车栈
{
car=PopStack(S);          //后面的车先出栈
car.position=car.position - 1;
PushStack(&p,car);         //入让车栈
}
lcar=car=PopStack(S);      //要离开的车出栈,列出信息
time(&Lt);
gm=gmtime(&Lt);
lcar.outtime=(*gm);
lcar.length=mktime(&lcar.outtime)- mktime(&lcar.intime);   /*time_t mktime(struct tm * timeptr)  将tm结构数据转换成从                                                                       公元1970年1月1号0时0分0秒算起至今的UTC时间所经过的秒数*/
lcar.expense=(lcar.length /3600 + 1)*PRICE;
Printfrate(&lcar);
while(! StackEmpty(p))
{
car=PopStack(&p);    //让路栈的车进车位
PushStack(S,car);
}
while(! StackFull(*S) && ! LinkQueueEmpty(*Q))   //等候队列中第一辆车进车库
{
car=PopLinkQueue(Q); 
time(&Lt);
gm=gmtime(&Lt);
car.intime=(*gm);
PushStack(S,car);
}





}
else
{
printf("输入车位错误,那个车位没有车!\n");
}




}
PushLinkQueue(L,lcar);        //要离开的车入离开队列
Menu(*S,*Q,*L);
printf("按回车键继续");
getchar();
return TRUE;


}


Status Showlcar(LinkQueue L)     //查看离开车辆
{
int i,count=0;
LinkPtr p;
p=L.front->next;
printf("是否有车离开过:\n");
if(LinkQueueEmpty(L))
{
printf("没有车离开过\n");
return FALSE;
}
    else
{
printf("有车离开过,离开车的信息:\n");
while(NULL !=p)
{

printf("车牌号:%s\n",p->data.name);
printf("进入时间:");
Printfdata(p->data.intime);
printf("离开时间:");
Printfdata(p->data.outtime);
printf("停车时间(秒):%d\n",p->data.length);
printf("费用(元):%d\n",p->data.expense);
p=p->next;
}
printf("按回车键继续...");
getchar();
return TRUE;




}
}


Status Showall(Stack S,LinkQueue Q,LinkQueue L)    //查看车库,便道上,包括已经离开的车的车辆信息,出入记录 
{
ShowStack(S);
ShowLinkQueue(Q);
Showlcar(L);
Menu(S,Q,L);
return TRUE;
}








int Leave(Stack *S,LinkQueue *Q,LinkQueue *L)   //离开车位
{


Leave_s(S,Q,L);
Menu(*S,*Q,*L);
printf("按回车键继续..\n");
getchar();
return TRUE;
}


Status  Seek(Stack S,LinkQueue Q,LinkQueue L)    //按车牌号查询车辆信息,停车时间,是否来过停车场,是否还在停车场
{


int i;
char sname[10];
Status flag=FALSE;
LinkPtr p;
p=L.front->next;
printf("请输入要查询的车牌号:\n");
scanf("%s",sname);
if(!LinkQueueEmpty(L))
{
while(NULL != p && flag==FALSE)
{
if(0 == strcmp(p->data.name,sname))
{
printf("该车来过停车场,现已离开\n");
printf("车牌号:%s\n",p->data.name);
printf("停车位置:%d\n",p->data.position);
printf("进入时间:");
Printfdata(p->data.intime);
printf("离开时间:");
Printfdata(p->data.outtime);
printf("停车时间(秒):%d\n",p->data.length);
printf("费用(元):%d\n",p->data.expense);
flag=TRUE;
}
p=p->next;
}

}
if(!StackEmpty(S))
{
for(i=0;i<=S.top && flag==FALSE;i++)
{
if(0 == strcmp(S.num[i].name,sname))
{
printf("该车在停车场内\n");
   printf("车牌号:%s\n",S.num[i].name);
   printf("进入时间:");
   Printfdata(S.num[i].intime);
           printf("停车位置:%d\n",S.num[i].position);
flag=TRUE;
}
}
}

if(StackEmpty (S)&& LinkQueueEmpty(L))
{
printf("该车没有来过停车场\n");
}
if(flag== FALSE)
{
printf("该车不在停车场内\n");
}


 
getchar();


Menu(S,Q,L);



}


Status Quit()    //退出程序
{
printf("欢迎你的下次使用!\n");
exit(0);
return TRUE;
}


int Menu(Stack S,LinkQueue Q,LinkQueue L)     //菜单
{
int ch;
printf("********欢迎使用停车场系统*********\n");
printf("(1)驶入停车场\n");
printf("(2)离开停车场\n");
printf("(3)查看停车场信息\n");
printf("(4)按车牌号查车辆信息\n");
printf("(5)退出系统\n");
printf("提示:本停车场共%d 个车位,停满后的车辆停在便道上!\n",MAX);
printf("收费标准,停在停车场的车辆:%.2f元/小时,停在便道上的车辆不收费!\n",PRICE);




while(1)
{
printf("输入你的选择(1-5):");
scanf("%d",&ch);
if(ch>=1 && ch<=5)
{
break;
}
else
{
printf("错误输入\n");
getchar();
}

}
switch(ch)
{
case 1:Reach(&S,&Q,&L);break;
case 2:Leave(&S,&Q,&L);break;
case 3:Showall(S,Q,L);break;
case 4:Seek(S,Q,L);break;
case 5:Quit();break;




}
return 0;






}
/******************************************************************************************************************************
 * 项目描述:停车场是一个能放n辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若停车场满了,车要停在门外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车要先退出,待它走后再依次进入。汽车离开时按停放时间收费。
 * **************************************************************************************************************************/
int main ()     //主函数
{
Stack s;
InitStack(&s);
LinkQueue q;
InitLinkQueue(&q);
LinkQueue l;
InitLinkQueue(&l);
Menu(s,q,l);
return 0;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值