【数据结构】车辆停车场代码,可实现车辆的出入和停车场信息查询

#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<time.h>
#define		MaxSize 5
//车辆信息 
typedef struct CarInfo
{
	char Number[9];
	time_t entertime;
	int	status;
 };



//栈 
typedef struct
{
	CarInfo car[MaxSize];
	int top;
 }stopstack;
/*初始化堆栈*/ 
void initstopstack(stopstack *s){ 
	s->top=-1;
}
/*求堆栈s的长度*/ 
int lengthstopstack(stopstack s){
	return (s.top+1);
}
/*判定栈s是否为空*/ 
int emptystopstack(stopstack s){
	return (s.top==-1);
}
/*将车辆car入库*/ 
void push(stopstack *s,CarInfo car){//需要判断栈是否已满 
		s->top++;
		s->car[s->top]=car;
}
/*将车辆car出库*/
CarInfo pop(stopstack *s){//需要判断栈是否为空 
		s->top--;
		return(s->car[s->top+1]);
}
//输出车库内车辆信息 
void printstopstack(stopstack s){
	int i;
	for(i=0;i<=s.top;i++){
		printf("%s ",s.car[i].Number);
		if(!(i+1)%5) printf("\n");
	}
}



//队列
typedef struct Qnode
{
	CarInfo data;
	struct Qnode *next;
}QueueNode;

typedef struct
{
	QueueNode *front,*rear;
}LinkQueue;
//初始化 
LinkQueue InitQueue()
{
	LinkQueue q;
	q.front=(QueueNode*)malloc(sizeof(QueueNode));
	q.rear=q.front;
	q.front->next=q.front;
	return q;
}
//是否为空
int QueueEmpty(LinkQueue q)
{
	return (q.front==q.rear);
 }
//求队列长度
int LenthQueue(LinkQueue q)
{
	int flag=0;
	QueueNode *p;
	p=q.front;
	while(p!=q.rear)
	{
		flag++;
		p=p->next;
	}
	return flag;
}
//将元素car入队列
void AddQueue(LinkQueue *q,CarInfo car)
{
	QueueNode *p;
	p=(QueueNode*)malloc(sizeof(QueueNode));
	p->data=car;
	p->next=q->rear->next;
	q->rear->next=p;
	q->rear=p;
}
//将元素car出队列
CarInfo  DeleteQueue(LinkQueue *q)
{
	CarInfo car;
	QueueNode *p;
	p=q->front->next;
	q->front->next=p->next;
	car=p->data;
	if(p==q->rear)	q->rear=q->front;
	free(p);
	return car;
}
//输出排队的车辆信息 
void ShowQueue(LinkQueue q)
	{
	int i=0;
	QueueNode *p;
	p=q.front;
	while(p!=q.rear)
	{
		p=p->next;
		printf("%s ",p->data.Number);		
		i++;
		if(!(i+1)%5) printf("\n");
	 }
} 



//结构体赋值 
CarInfo inputCarInfo(char *pN,time_t t,int st){
	CarInfo car;
	strcpy(car.Number,pN);
	car.entertime=t;
	car.status=st;
	return car;
}
//时间
void printEnterExit(CarInfo car){
	struct tm *ptr;
	time_t bt,lt;
	char now[40];
	bt=car.entertime;
	ptr=localtime(&bt);//入库时间
	printf("\n车辆号牌: %s",car.Number);
	strftime(now,39,"\n车辆入库时间:%Y-%m-%d %H:%M:%S",ptr);
	puts(now);
	
	if(!car.status){
		time(&lt);
		ptr=localtime(&lt);//出库时间
		strftime(now,39,"\n车辆出库时间:%Y-%m-%d %H:%M:%S",ptr);
		puts(now);
		printf("\n车辆停车时间为:%ds,车辆的停车费为$%.2d",lt-bt,(lt-bt)*5); 
	} 
}



int main(){
	int c; 
	char yn,pN[9];
	time_t t;
	stopstack s,tt;//停车栈,临时栈 
	LinkQueue q;//队列 
	CarInfo car,carr;
	initstopstack(&s);//初始化栈
	initstopstack(&tt);
	q=InitQueue();//初始化队列
	while(1){//菜单 
		printf("********************         菜 单        *********************\n");
		printf("****          1、入库                         2、出库\n");
		printf("*             3、车库与队列中的车辆信息       4、退出\n"); 
		printf("***************************************************************\n");
		printf("\n请选择(1、2、3、4:)\n"); 
		scanf("%d",&c);	getchar(); 	
		switch(c){
			case 1:
				while(1){
					printf("\n请输入入库车辆的车牌:");
					gets(pN);
					time(&t);
					car=inputCarInfo(pN,t,1);
					printf("请入库车辆信息:%s\n是否正确?(y/n)",car.Number);
					yn=getchar();getchar();
					if(yn=='y'||yn=='Y') break;
					printf("输入的车辆信息与入库车辆信息不符!请重新输入\n");
				}
				if(s.top<MaxSize-1){//栈未满,入库 
					push(&s,car);
					printEnterExit(car);//入库时间  
					printf("\n车库中现有车辆有:\n");
					printstopstack(s);
					printf("\n");		
				}
				else{//栈满,入队 
					 AddQueue(&q,car);
					 printf("\n正在排队的车辆有:\n");
					 ShowQueue(q);
					 printf("\n");
				}
				break;
				
			case 2:
				if(emptystopstack(s)) printf("\n车库内没有车辆,无法出库!\n"); 
				else{
					printf("\n请输入出库车辆的车牌:\n");
					gets(pN);
					while(s.top!=-1){
						car=pop(&s);
						if(strcmp(car.Number,pN))  push(&tt,car); 
						else {
							car.status=0;//找到出库车辆 
							break;
						}
					}
					
					while(tt.top!=-1){//把临时栈的车放回停车库 
						carr=pop(&tt);
						push(&s,car);
					}
					
					if(car.status!=0){
						printf("输入的出库车辆不存在!");
						break;
					}
					
					printEnterExit(car);//出库时间 
					
					if(!QueueEmpty(q)){//出库后处理排队车辆 
						car=DeleteQueue(&q);//出队列 
						
						time(&t);
						car.entertime=t;
						car.status=1;
						push(&s,car);//入库 	
					}
				}
				break;
				
			case 3:
				printf("\n车库中车辆有:\n");
				printstopstack(s);
				printf("\n正在排队的车辆有:\n");
				ShowQueue(q);
				break;
				
			case 4:
				return 1; 
				break;	
							
			default:
		   	    printf("输入有误,请重新输入!!!");		
        }
	    system("pause");
		system("cls");
	}
	
	return 0;



}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Terunsu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值