#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(<);
ptr=localtime(<);//出库时间
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;
}
【数据结构】车辆停车场代码,可实现车辆的出入和停车场信息查询
于 2023-05-31 16:24:30 首次发布