这是是停车场管理程序主要运用了数据结构中的队列与栈的组合
先来看看效果:
#include <iostream>
#include <malloc.h>
#include <stdio.h>
#include <windows.h>
#include "Stack.cpp"
#define MaxSize 20///控制停车场停车的车辆数
typedef int ElemType;
int h=0;///用来记录停车场停几辆车
ElemType e;
int k=0;///记录结构体的次序
int sa=2;
int h_wait=0;
struct Time
{
int id;
int hour;
int Minute;
int Second;
} tm[100];
typedef struct
{
ElemType data[MaxSize];
int front,rear;
} SqQueue;
///初始化栈
void InitQueue(SqQueue *&q)
{
q = (SqQueue *)malloc(sizeof(SqQueue));
q ->front=q ->rear=0;
}
void DestoryQueue(SqQueue *&q)
{
free(q);
}
bool QueueEmpty(SqQueue *q)
{
return q ->front==q ->rear;
}
bool enQueue(SqQueue *&q,ElemType e)
{
if((q ->rear+1)%MaxSize==q ->front)
return false;
q ->rear=(q ->rear+1)%MaxSize;
q ->data[q ->rear]=e;
return true;
}
bool deQueue(SqQueue *&q,ElemType &e)
{
if(q ->front==q ->rear)
return false;
q ->front=(q ->front+1)%MaxSize;
e =q ->data[q ->front];
return true;
}
int QueueLength(SqQueue *q)
{
return (q ->rear-q ->front+MaxSize)%MaxSize;
}
void display(SqQueue *q)
{
system("cls");
for(int i=1; i<=h_wait; i++)
printf("\t\t 车牌号:%d ",q ->data[i]);
printf("\n");
printf("\n\t\t ***************************************\n");
printf("\t\t * 一共有%d辆车 *",h_wait);
printf("\n\t\t ***************************************\n");
}
int GetTimeHour()///得到当前的小时
{
SYSTEMTIME sys;
GetLocalTime( &sys );
return sys.wHour;
}
int GetTimeSecond()///得到当前的秒
{
SYSTEMTIME sys;
GetLocalTime( &sys );
return sys.wSecond;
}
int GetTimeMinute()///得到当前的分钟
{
SYSTEMTIME sys;
GetLocalTime( &sys );
return sys.wMinute;
}
void EnterStation(SqQueue *&q,SqStack *&s)///进入停车场
{
int number;
int a,b;///b代表车牌号
/*
**通过h来判断停车区是否已经满啦,
**若h>=20进入候车区
*/
if(h>=3)
{
printf("停车场的停车位已满,请选择:\n");
printf(" 1:进入候车区 2:退出 \n");
scanf("%d",&a);
if(a==1)
{
printf("请输入车辆的车牌号:\n");
scanf("%d",&b);
enQueue(q,b);///让车辆进入队列
h_wait++;
system("cls");
printf("\n\t\t ***************************************\n");
printf("\t\t *恭喜你车牌号为%d的车辆进入候车场成功*",b);
printf("\n\t\t ***************************************\n");
//lang();///返回主菜单
}
if(a==2)
{
exit(0);
}
}
else
{
///进入停车场
printf("请输入车辆的车牌号:\n");
scanf("%d",&b);
Push(s,b);
///引入结构体来记录车辆的车牌号和时间
tm[k].id=b;
tm[k].Second=GetTimeSecond();
tm[k].Minute=GetTimeMinute();
tm[k].hour=GetTimeHour();
k++;
h++;
system("cls");
printf("\n\t\t ***************************************\n");
printf("\t\t *恭喜你车牌号为%d的车辆进入停车场成功*",b);
printf("\n\t\t ***************************************\n");
}
}
void Stackdisplay(SqStack *s)
{
int a[100],b;
for(int i=0; i<h; i++)
{
Pop(s,b);
a[i]=b;
printf("%d ",b);
}
for(int i=0; i<h; i++)
{
Push(s,a[i]);
}
}
void ExitStation(SqQueue *&q,SqStack *&s)///退出车站
{
int number;
int sum,m1,k1=0,f=0;
int b[100],h1=0,m=0;///用来记录先退出车站的车牌号,但不是离开车站的
if(StackEmpty(s))
{
printf("对不起,停车区为空\n");
}
else
{
Stackdisplay(s);///展示出当前停车区的所有车辆的信息
printf("\n请输入要出停车区的车牌号:");
for(int i1=0;; i1++)
{
scanf("%d",&number);
for(int j=0; j<h; j++) ///用来判断是否存在该车牌
{
if(number==tm[j].id)
{
k1=1;
break;
}
}
if(k1==1)
{
for(int i=0;; i++)
{
/*
**先让每个不是此车牌号的车出站
**如果number与e相等则停止出站
*/
h--;
Pop(s,m);
if(number==m)
{
///用来计算车出车站时要交的费用
for(int j=0; j<k; j++)
{
if(tm[j].id==number)
{
sum=(GetTimeMinute()*60+GetTimeSecond())-(tm[j].Minute*60+tm[j].Second);
tm[j].id=-1;///让此时的车牌号标记为空
break;
}
}
printf("请你交费%d\n",sum*sa);
printf("请输入你的金额");
scanf("%d",&m1);
printf("找你%d\n",m1-sum*sa);
printf("祝你一路顺风");
break;
}
else
{
b[h1++]=m;
}
}
for(int i=0; i<h1; i++)
{
Push(s,b[i]);
h++;
}
if(!QueueEmpty(q))///判断此时的候车区是否为空
{
deQueue(q,e);///出候车区
h_wait--;
Push(s,e);///进停车区
tm[k].id=e;
tm[k].Second=GetTimeSecond();
tm[k].Minute=GetTimeMinute();
tm[k].hour=GetTimeHour();
k++;
h++;
}
f=0;
}
else
{
printf("你输出的车牌号有误,请重新输入\n");
f=1;
}
if(f==0)///用来判断是否走出这个循环
{
break;
}
}
}
}
void InquiryConsumption(SqQueue *&q,SqStack *&s)
{
system("cls");
printf("\n\t\t 车牌号 进场时间 现在时间 消费金额\n");
for(int i=0; i<k; i++)
{
int sum=(GetTimeMinute()*60+GetTimeSecond())-(tm[i].Minute*60+tm[i].Second);
if(tm[i].id!=-1)
{
printf("\t\t %d %d:%d:%d %d:%d:%d %d\n",tm[i].id,tm[i].hour,tm[i].Minute,tm[i].Second,
GetTimeHour(),GetTimeMinute(),GetTimeSecond(),sum*sa);
}
}
}
void menu()
{
printf("\n\n\t\t\t 欢迎使用停车场管理系统\n\n");
printf("\t\t\t***************************\n");
printf("\t\t\t* 主菜单 *\n");
printf("\t\t\t***************************\n\n");
printf("\t\t 1 车辆进站 \n");
printf("\t\t 2 车辆出站 \n");
printf("\t\t 3 消费查询 \n");
printf("\t\t 4 查询数量(候车场) \n");
printf("\t\t 5 退出系统\n");
printf("\t\t 请选择[1/2/3/4/5/]:\n");
}
int main()
{
int j;
SqStack *s;
SqQueue *q;
int a=2,b=3,c=4,d=5;
InitStack(s);
InitQueue(q);
while(1)
{
//system("cls");
menu();
scanf("%d",&j);
switch(j)
{
case 1:
EnterStation(q,s);
break;
case 2:
ExitStation(q,s);
break;
case 3:
InquiryConsumption(q,s);
break;
case 4:
display(q);
break;
case 5:
exit(0);
default:
printf("输入错误,请重新输入!\n");
}
}
return 0;
}
以上的是一个主函数,下面是个头文件
#include <iostream>
#define MaxSize 20
#include <malloc.h>
#include<string.h>
#include<stdio.h>
typedef int ElemType;
using namespace std;
typedef struct sqStack
{
ElemType data;
struct sqStack *next;
} SqStack;
///初始化栈
void InitStack(SqStack *&s)
{
s=(SqStack *)malloc(sizeof(SqStack));
s ->next=NULL;
}
void DestoryStack(SqStack *&s)
{
SqStack *p=s,*q=s ->next;
while(q!=NULL)
{
free(p);///先释放p节点,及刚开始释放头结点
p=q;///p往后移动
q=p ->next;///q往后移
}
free(p);
}
bool StackEmpty(SqStack *s)
{
return s ->next==NULL;
}
void Push(SqStack *&s,ElemType e)
{
SqStack *p ;
p=(SqStack *)malloc(sizeof(SqStack));
p ->data=e;
p ->next=s ->next;
s ->next=p;
}
bool Pop(SqStack *&s,ElemType &e)
{
SqStack *p;
if(s ->next==NULL)
return false;
p=s ->next;
e=p ->data;
s ->next=p ->next;
free(p);
return true;
}
bool GetTop(SqStack *&s,ElemType &e)
{
if(s ->next=NULL)
return false;
e=s ->next->data;
return true;
}
大致就这样