资源描述
#include<stdio.h>
#include<stdlib.h>
#define stacksize 2 //车站//容量
///////////////////////////////////////////////////////
typedef struct Snode{
int number;
float int_time[2];
float bian_time[2];
}record;
typedef struct {
record *base;
record *top;
int size;
}Stack;
/////////////////////////////////////////////////////
typedef struct Qnode{
int number;
float int_time[2];
struct Qnode *next;
}Qnode,*Queue;
typedef struct {
Queue front;
Queue rear;
}Linkqueue;
void xunhuan(Stack L,Linkqueue Q);
void jixu(Stack L,Linkqueue Q);
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
void InitStack(Stack &L) //堆栈操作
{
L.base=(record*)malloc(sizeof(Snode)*stacksize);
if(!L.base)
exit(0);
L.top=L.base;
L.size=stacksize;
}
/////////////////////////////////////////////////////
void input(Stack &L,record h)
{
*L.top++=h;
}
///////////////////////////////////////////////////
Snode output(Stack &L,record &e)
{
e=*--L.top;
return e;
}
int Stackman(Stack L)
{
if(L.top-L.base==L.size)
return 0;
else
return 1;
}
int StackEmpty(Stack L)
{
if(L.base==L.top)
return 0;
else
return 1;
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void Initque(Linkqueue &Q) //队列操作
{
Q.front=Q.rear=(Queue)malloc(sizeof(Qnode));
if(!Q.front)
exit(0);
Q.front->next=NULL;
}
//////////////////////////////////////////////////
void enqueue(Linkqueue &Q,int number,float time[])
{
Queue q;
printf("停车场已满,请将车辆停入便道!\n");
q=(Queue)malloc(sizeof(Qnode));
q->int_time[0]=time[0];
q->int_time[1]=time[1];
q->number=number;
q->next=NULL;
Q.rear->next=q;
Q.rear=q;
}
///////////////////////////////////////////////////
void outqueue(Linkqueue &Q,Queue &e) //此处有点问题??????????????
{
// Qnode *q;
// q=(Queue)malloc(sizeof(Qnode));
e=Q.front->next;
// Q.front->next=q->next;
//delete q;
Q.front->next=Q.front->next->next;
if(Q.rear==e){
Q.front=Q.rear;
// Q.front=NULL;
}
}
int QEmpty(Linkqueue Q)
{
if(Q.rear==Q.front)
return 0;
else
return 1;
}
//////////////////////////////////////////////////// //停车场管理操作
////////////////////////////////////////////////////
void jixu(Stack L,Linkqueue Q)
{
int n;
fflush(stdin);
scanf("%d",&n);
switch(n)
{
case 1:
printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
xunhuan(L,Q);
break;
case 2:
printf("****************************退出管理系统*****************************\n");
break;
default:
printf("\n输入错误,请重新输入: ");
jixu(L,Q);
break;
}
}
void jiaofei(float time[],float time1[],float time2[]) //缴费操作
{
float data1,data2;
double money;
if(time2[0]!=0&&time2[1]!=0)
data2=(time1[0]-time2[0]-1)*60+60-time2[1]+time1[1];
else
data2=0;
data1=(time[0]-time1[0]-1)*60+60-time1[1]+time[1];
// printf("进入车场时间%f,退出车场时间%f\n",time1[1],time[1]);
printf("你的停车时间为%lf小时 ,在便道停留时间%f小时\n",data1/60,data2/60);
money=data1/60*5.0+data2/60*2.0;
printf("请交纳%lf元\n",money);
/* if(data1<=60.0)
printf("请交纳5元。");
if(data1>60.0&&data1<=120.0)
printf("请交纳10元。");
if(data1>120.0)
printf("请交纳20元。");*/
}
void leave(Stack &L,Linkqueue &Q,int number,float time[]) //汽车离开操作
{
Stack S;
InitStack(S);
float time1[2],time2[2];
record e,e1;
Queue q;
e1=output(L,e);
while(e.number!=number)
{
input(S,e1);
e1=output(L,e);
}
time1[0]=e.int_time[0]; //入车站时间
time1[1]=e.int_time[1];
time2[0]=e.bian_time[0]; //入便道时间
time2[1]=e.bian_time[1];
jiaofei(time,time1,time2); //////////////////////////
while(StackEmpty(S))
input(L,output(S,e1));
while(QEmpty(Q)&&Stackman(L))
{
outqueue(Q,q);
//printf("\n\n请输入汽车从便道进入停车场的时间,输入格式为(时 空格 分):");
e.bian_time[0]=q->int_time[0];
e.bian_time[1]=q->int_time[1];
//scanf("%f %f",&time2[0],&time2[1]);
e.int_time[0]=time[0];
e.int_time[1]=time[1];
e.number=q->number;
printf("\n汽车从便道退出进入停车场……");
printf("\n请将%d号车停在%d号位置!\n",e.number,L.top-L.base+1);
input(L,e);
}
}
/////////////////////////////////////////////////////
void xunhuan(Stack L,Linkqueue Q) //选择操作及循环
{
// Queue q;
char ch;
int number;
float time[2],time2[2];
fflush(stdin);
printf("\nA:进入停车场 D:退出停车场 E:退出管理系统\n");
printf("\n请输入:");
scanf("%c",&ch);
fflush(stdin);
switch(ch)
{
case 'A':
printf("\n请输入车牌号: ");
scanf("%d",&number);
printf("请输入入场时间,输入格式为(时 空格 分):");
scanf("%f %f",&time[0],&time[1]);
if(Stackman(L))
{ record e;
e.int_time[0]=time[0];
e.int_time[1]=time[1];
e.bian_time[0]=0.0;
e.bian_time[1]=0.0;
e.number=number;
printf("请将车停在%d号位置!",L.top-L.base+1);
input(L,e);
}
else
{
enqueue(Q,number,time);
}
printf("\n");
printf("\n1、继续操作 2、退出操作 : ");
jixu(L,Q);
break;
case 'D':
if(StackEmpty(L))
{
printf("请输入离开汽车的车牌号:");
scanf("%d",&number);
printf("输入汽车离开时间:");
scanf("%f %f",&time2[0],&time2[1]);
leave(L,Q,number,time2);
}
else
printf("停车场为空\n");
printf("\n1、继续操作 2、退出操作 : ");
jixu(L,Q);
break;
case 'E':
{
printf("***************************退出管理系统*****************************\n");
break;
}
default:
{
printf("输入错误,请重新输入!\n");
printf("############################################################\n");
xunhuan(L,Q);
break;
}
}
}
////////////////////////////////////////////////////
////////////////////////////////////////////////////
void main() //主函数操作
{
Linkqueue Q;
Stack L;
InitStack(L);
Initque(Q);
printf("****************************欢迎进入停车场管理系统******************************\n");
printf(" 收费标准\n");
printf(" ------------------------------------\n");
printf(" | 车场内5.0元/h,便道内2.0元/h | \n");
printf(" ------------------------------------\n");
printf(" \n---------------------------------请选择操作-------------------------------------\n");
xunhuan(L,Q);
}
展开阅读全文