停车场管理 -- 队列 栈 实现
2012-07-21 15:03
316 查看
实现功能 :
1. 查看停车场全部车子情况;
2. 查看某辆车的费用情况;
3. 停车;
4. 离开(如果车场满并且等待区有车子在等待,这时如果有车子离开会提醒等待区排在第一位的车子进入停车场);
5. 查看等待区的车子 ;
6. 离开等待序列
7. 停车场满时可排队等待 ;
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define LIM 10 //定义停车场可停车的限制数量
#define M 1 //一秒钟一元
int sq = 0 ; //停车序号,当车场满时为等待序号
typedef struct node_p //停车队列 顺序
{
int car_num[LIM];
int ptime[LIM];
int front,rear;
}PARK;
typedef struct node
{
int n;
int t;
}NODE;
typedef struct give //让路 顺序栈
{
int time[LIM];
int num[LIM];
int top;
}WAY;
typedef struct node_w //等待队列 链式
{
int wn;
struct node_w *next;
}NODE_W;
typedef struct queue
{
NODE_W *front,*rear;
}WAIT;
PARK *park;
WAY *way;
WAIT *wait;
void init_park() //初始化停车队列
{
park = (PARK *)malloc(sizeof(PARK));
park->rear = 0;
park->front = 0;
park->car_num[park->front] = 0;
}
void init_way() //初始化让路栈
{
way = (WAY *)malloc(sizeof(WAY));
way->top = -1;
}
void init_wait() //初始化等待队列
{
wait = (WAIT *)malloc(sizeof(WAIT));
wait->front = (NODE_W *)malloc(sizeof(NODE_W));
wait->front->wn = 0;
wait->front->next = NULL;
wait->rear = wait->front;
}
void en_way(WAY *W,int tm,int n) //进入让路栈,n:让路车的序号,tm: 让路车的进入停车场时间
{
W->top ++;
W->num[W->top] = n;
W->time[W->top] = tm;
//printf("push : %d\n",n);
}
NODE *out_way(WAY *W) // 出让路栈
{
NODE *ptr = (NODE *)malloc(sizeof(NODE));
ptr->t = W->time[W->top];
ptr->n = W->num[W->top];
//printf("pop :%d\n",ptr->n);
W->top --;
return ptr;
}
void display_way() // 测试有没有进入让路栈
{
printf("让路的车:\n");
int n = 0;
while(n != way->top + 1)
{
printf("序 号:");
printf("%d\t",way->num
);
printf("\n");
printf("停车时间:");
printf("%d\t",way->time
);
printf("\n");
n ++;
}
}
void en_wait(WAIT * W) //进入等待队列
{
if(W->front->wn == 0)
{
W->front->wn= sq;
}
else
{
NODE_W *ptr = (NODE_W *)malloc(sizeof(NODE_W));
ptr->wn = sq;
W->rear->next = ptr;
W->rear = ptr;
}
}
int out_wait(WAIT *W) //等待队列第一个出 进如停车场
{
int n;
n = W->front->wn;
W->front = W->front->next;
return n;
}
void display_wait(WAIT *W) //显示等待队列中车子的停车序号
{
NODE_W *ptr = W->front;
printf("正在等待的车子: ");
while(ptr != NULL)
{
printf("M",ptr->wn);
ptr = ptr->next;
}
}
void en_park(PARK *P) //进入停车场 —— 停车
{
time_t now;
now = time(NULL);
sq = sq + 1;
if(P->rear+1 == LIM)
{
printf("停车场已满,请等待!\n");
printf("\t (=_=) 您的等待停车序号是%d. (=_=)\n",sq);
en_wait(wait);
}
else
{
if(P->car_num[P->front] == 0)
{
P->car_num[P->front] = sq;
P->ptime[P->front] = now;
printf("\t(^_^) 您的停车序号是%d. (^_^)\n",sq);
}
else
{
P->rear ++;
P->car_num[P->rear] = sq;
P->ptime[P->rear] = now;
printf("\t(^_^) 您的停车序号是%d. (^_^)\n",sq);
}
}
}
void back_park(PARK *P,int n,int t) //从让路栈返回停车场
{
//printf("back : %d\n",n);
//printf("back front : %d\t",P->front);
if(P->car_num[P->front] == 0)
{
P->car_num[P->front] = n;
P->ptime[P->front] = t;
}
else
{
if(P->car_num[P->rear] == 0)
{
P->car_num[P->rear] = n;
P->ptime[P->rear] = t;
}
else
{
P->rear ++;
P->car_num[P->rear] = n;
P->ptime[P->rear] = t;
}
}
//printf("back rear : %d\t",P->rear);
}
int leave_park(PARK *P,int n,WAY *W) //车离开停车场
{
int time;
if(P->car_num[P->rear] == n)
{
time = P->ptime[P->rear];
P->car_num[P->rear] = 0;
P->ptime[P->rear] = 0;
P->rear = P->rear - 1;
return time;
}
else
{
while(P->car_num[P->rear] != n)
{
en_way(W,P->ptime[P->rear],P->car_num[P->rear]);
P->rear --;
//display_way();
}
time = P->ptime[P->rear];
P->car_num[P->rear] = 0;
P->ptime[P->rear] = 0;
NODE *ptr = (NODE *)malloc(sizeof(NODE));
while(W->top != -1)
{
ptr = out_way(W);
//display_way();
back_park(P,ptr->n,ptr->t);
}
return time;
}
}
void wait_park(PARK *P) //当车场已满然后有车离开时提醒等待序列中的第一个进入停车场
{
if(P->rear+1 != LIM) //判断停车场是否已满 如果没有满
{
int n = 0;
n = out_wait(wait);
time_t t;
t = time(NULL);
printf("等待车队中停车序号%d的车子可以进入停车场\n",n);
if(P->car_num[P->front] == 0)
{
P->car_num[P->front] = n;
P->ptime[P->front] = t;
}
else
{
P->rear ++;
P->car_num[P->rear] = n;
P->ptime[P->rear] = t;
}
printf("\t(^_^) 您的停车序号是%d. (^_^)\n",n);
}
}
void search(PARK *P,int number) // 查看一辆车的情况
{
int i = 0;
float c = 0;
int n = 0;
time_t tm;
tm = time(NULL);
printf("%d\n",tm);
while(P->car_num[i] != number)
{
i ++;
}
printf("%d\n",P->ptime[i]);
c = (tm - P->ptime[i])*M;
n = P->car_num[i];
printf("您的停车号: %d \t 目前费用:%5.2f !\n",n,c);
}
void display_park(PARK *P,int n) //显示停车场目前情况
{
if(n == LIM - 1)
{
printf("停车场已满,请等待!\n");
}
else
{
if(n < LIM)
{
printf("停车场内可停放%d辆车,目前停车场内停放了%d辆车.\n",LIM,n);
}
}
}
void display_car(PARK *P) //查看车场内所有车的情况
{
int n = 0;
float count = 0;
if(P->car_num[P->front] == 0)
{
printf("车场空,欢迎停车!\n");
}
else
{
printf("车场内有%d辆车,具体信息如下 :\n",P->rear+1);
while(n < P->rear + 1)
{
time_t tm;
tm = time(NULL);
printf("停车序号: ");
printf("M\t ",P->car_num
);
count = (tm - P->ptime
)*M;
printf("目前费用:");
printf("%4.1f\t",count);
printf("\n");
n ++;
}
printf("\n");
if(n == LIM )
{
printf("车场已满,请稍候\n");
printf("\n");
}
}
}
void o_wait(int n) //离开等待序列
{
NODE_W *ptr = wait->front->next;
NODE_W *tmp = (NODE_W *)malloc(sizeof(NODE_W));
if(wait->front->wn == n)
{
out_wait(wait);
}
else
{
while(ptr->wn != n)
{
tmp = ptr;
ptr = ptr->next;
}
tmp->next = ptr->next;
tmp = ptr;
ptr = ptr->next;
free(tmp);
}
}
int main()
{
printf("************************************************************\n");
printf("************************************************************\n");
printf("\t\t欢迎来到来福停车场\n");
printf(" \t来福车场停车每分钟60元,感谢您选择来福\n");
printf("************************************************************\n");
printf("************************************************************\n");
printf("\n");
init_park();
init_way();
init_wait();
display_park(park,0);
printf("\n");
while(1)
{
int n;
printf("\n");
printf("****************************************\n");
printf("\t1 : 查看停车场当前情况\n");
printf("\t2 : 停车\n");
printf("\t3 : 离开\n");
printf("\t4 : 查看车的情况\n");
printf("\t5 : 查看等待队列\n");
printf("\t6 : 离开等待队列\n");
printf("\t7 : 退出\n");
printf("****************************************\n");
printf("\n");
printf("请输入你的需要:");
scanf("%d",&n);
printf("\n");
switch(n)
{
case 1:
display_car(park);
break;
case 2:
en_park(park);
break;
case 3:
{
if(park->car_num[park->front] == 0)
{
printf("场内没有车\n");
break;
}
int n;
int tm;
float t;
time_t lv_t;
float count;
printf("请输入你要开走的车辆的序号:");
scanf("%d",&n);
tm = leave_park(park,n,way);
lv_t = time(NULL);
count = (lv_t - tm) * M;
printf("您的车在本停车场内停放%d秒,共消费%5.2f元\n",lv_t - tm,count);
printf("\n");
if(wait->front->wn != 0)
{
wait_park(park);
if(wait->front == NULL)
{
wait ->front = (NODE_W *)malloc(sizeof(NODE));
}
}
}
break;
case 4:
{ int n;
printf("请输入你的车的停车序号:");
scanf("%d",&n);
search(park,n);
}
break;
case 5: display_wait(wait);
break;
case 6:
{
int n;
printf("请输入要离开的停车序号:");
scanf("%d",&n);
o_wait(n);
}break;
case 7:
exit(0);
break;
default : break;
}
}
return 0;
}
1. 查看停车场全部车子情况;
2. 查看某辆车的费用情况;
3. 停车;
4. 离开(如果车场满并且等待区有车子在等待,这时如果有车子离开会提醒等待区排在第一位的车子进入停车场);
5. 查看等待区的车子 ;
6. 离开等待序列
7. 停车场满时可排队等待 ;
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define LIM 10 //定义停车场可停车的限制数量
#define M 1 //一秒钟一元
int sq = 0 ; //停车序号,当车场满时为等待序号
typedef struct node_p //停车队列 顺序
{
int car_num[LIM];
int ptime[LIM];
int front,rear;
}PARK;
typedef struct node
{
int n;
int t;
}NODE;
typedef struct give //让路 顺序栈
{
int time[LIM];
int num[LIM];
int top;
}WAY;
typedef struct node_w //等待队列 链式
{
int wn;
struct node_w *next;
}NODE_W;
typedef struct queue
{
NODE_W *front,*rear;
}WAIT;
PARK *park;
WAY *way;
WAIT *wait;
void init_park() //初始化停车队列
{
park = (PARK *)malloc(sizeof(PARK));
park->rear = 0;
park->front = 0;
park->car_num[park->front] = 0;
}
void init_way() //初始化让路栈
{
way = (WAY *)malloc(sizeof(WAY));
way->top = -1;
}
void init_wait() //初始化等待队列
{
wait = (WAIT *)malloc(sizeof(WAIT));
wait->front = (NODE_W *)malloc(sizeof(NODE_W));
wait->front->wn = 0;
wait->front->next = NULL;
wait->rear = wait->front;
}
void en_way(WAY *W,int tm,int n) //进入让路栈,n:让路车的序号,tm: 让路车的进入停车场时间
{
W->top ++;
W->num[W->top] = n;
W->time[W->top] = tm;
//printf("push : %d\n",n);
}
NODE *out_way(WAY *W) // 出让路栈
{
NODE *ptr = (NODE *)malloc(sizeof(NODE));
ptr->t = W->time[W->top];
ptr->n = W->num[W->top];
//printf("pop :%d\n",ptr->n);
W->top --;
return ptr;
}
void display_way() // 测试有没有进入让路栈
{
printf("让路的车:\n");
int n = 0;
while(n != way->top + 1)
{
printf("序 号:");
printf("%d\t",way->num
);
printf("\n");
printf("停车时间:");
printf("%d\t",way->time
);
printf("\n");
n ++;
}
}
void en_wait(WAIT * W) //进入等待队列
{
if(W->front->wn == 0)
{
W->front->wn= sq;
}
else
{
NODE_W *ptr = (NODE_W *)malloc(sizeof(NODE_W));
ptr->wn = sq;
W->rear->next = ptr;
W->rear = ptr;
}
}
int out_wait(WAIT *W) //等待队列第一个出 进如停车场
{
int n;
n = W->front->wn;
W->front = W->front->next;
return n;
}
void display_wait(WAIT *W) //显示等待队列中车子的停车序号
{
NODE_W *ptr = W->front;
printf("正在等待的车子: ");
while(ptr != NULL)
{
printf("M",ptr->wn);
ptr = ptr->next;
}
}
void en_park(PARK *P) //进入停车场 —— 停车
{
time_t now;
now = time(NULL);
sq = sq + 1;
if(P->rear+1 == LIM)
{
printf("停车场已满,请等待!\n");
printf("\t (=_=) 您的等待停车序号是%d. (=_=)\n",sq);
en_wait(wait);
}
else
{
if(P->car_num[P->front] == 0)
{
P->car_num[P->front] = sq;
P->ptime[P->front] = now;
printf("\t(^_^) 您的停车序号是%d. (^_^)\n",sq);
}
else
{
P->rear ++;
P->car_num[P->rear] = sq;
P->ptime[P->rear] = now;
printf("\t(^_^) 您的停车序号是%d. (^_^)\n",sq);
}
}
}
void back_park(PARK *P,int n,int t) //从让路栈返回停车场
{
//printf("back : %d\n",n);
//printf("back front : %d\t",P->front);
if(P->car_num[P->front] == 0)
{
P->car_num[P->front] = n;
P->ptime[P->front] = t;
}
else
{
if(P->car_num[P->rear] == 0)
{
P->car_num[P->rear] = n;
P->ptime[P->rear] = t;
}
else
{
P->rear ++;
P->car_num[P->rear] = n;
P->ptime[P->rear] = t;
}
}
//printf("back rear : %d\t",P->rear);
}
int leave_park(PARK *P,int n,WAY *W) //车离开停车场
{
int time;
if(P->car_num[P->rear] == n)
{
time = P->ptime[P->rear];
P->car_num[P->rear] = 0;
P->ptime[P->rear] = 0;
P->rear = P->rear - 1;
return time;
}
else
{
while(P->car_num[P->rear] != n)
{
en_way(W,P->ptime[P->rear],P->car_num[P->rear]);
P->rear --;
//display_way();
}
time = P->ptime[P->rear];
P->car_num[P->rear] = 0;
P->ptime[P->rear] = 0;
NODE *ptr = (NODE *)malloc(sizeof(NODE));
while(W->top != -1)
{
ptr = out_way(W);
//display_way();
back_park(P,ptr->n,ptr->t);
}
return time;
}
}
void wait_park(PARK *P) //当车场已满然后有车离开时提醒等待序列中的第一个进入停车场
{
if(P->rear+1 != LIM) //判断停车场是否已满 如果没有满
{
int n = 0;
n = out_wait(wait);
time_t t;
t = time(NULL);
printf("等待车队中停车序号%d的车子可以进入停车场\n",n);
if(P->car_num[P->front] == 0)
{
P->car_num[P->front] = n;
P->ptime[P->front] = t;
}
else
{
P->rear ++;
P->car_num[P->rear] = n;
P->ptime[P->rear] = t;
}
printf("\t(^_^) 您的停车序号是%d. (^_^)\n",n);
}
}
void search(PARK *P,int number) // 查看一辆车的情况
{
int i = 0;
float c = 0;
int n = 0;
time_t tm;
tm = time(NULL);
printf("%d\n",tm);
while(P->car_num[i] != number)
{
i ++;
}
printf("%d\n",P->ptime[i]);
c = (tm - P->ptime[i])*M;
n = P->car_num[i];
printf("您的停车号: %d \t 目前费用:%5.2f !\n",n,c);
}
void display_park(PARK *P,int n) //显示停车场目前情况
{
if(n == LIM - 1)
{
printf("停车场已满,请等待!\n");
}
else
{
if(n < LIM)
{
printf("停车场内可停放%d辆车,目前停车场内停放了%d辆车.\n",LIM,n);
}
}
}
void display_car(PARK *P) //查看车场内所有车的情况
{
int n = 0;
float count = 0;
if(P->car_num[P->front] == 0)
{
printf("车场空,欢迎停车!\n");
}
else
{
printf("车场内有%d辆车,具体信息如下 :\n",P->rear+1);
while(n < P->rear + 1)
{
time_t tm;
tm = time(NULL);
printf("停车序号: ");
printf("M\t ",P->car_num
);
count = (tm - P->ptime
)*M;
printf("目前费用:");
printf("%4.1f\t",count);
printf("\n");
n ++;
}
printf("\n");
if(n == LIM )
{
printf("车场已满,请稍候\n");
printf("\n");
}
}
}
void o_wait(int n) //离开等待序列
{
NODE_W *ptr = wait->front->next;
NODE_W *tmp = (NODE_W *)malloc(sizeof(NODE_W));
if(wait->front->wn == n)
{
out_wait(wait);
}
else
{
while(ptr->wn != n)
{
tmp = ptr;
ptr = ptr->next;
}
tmp->next = ptr->next;
tmp = ptr;
ptr = ptr->next;
free(tmp);
}
}
int main()
{
printf("************************************************************\n");
printf("************************************************************\n");
printf("\t\t欢迎来到来福停车场\n");
printf(" \t来福车场停车每分钟60元,感谢您选择来福\n");
printf("************************************************************\n");
printf("************************************************************\n");
printf("\n");
init_park();
init_way();
init_wait();
display_park(park,0);
printf("\n");
while(1)
{
int n;
printf("\n");
printf("****************************************\n");
printf("\t1 : 查看停车场当前情况\n");
printf("\t2 : 停车\n");
printf("\t3 : 离开\n");
printf("\t4 : 查看车的情况\n");
printf("\t5 : 查看等待队列\n");
printf("\t6 : 离开等待队列\n");
printf("\t7 : 退出\n");
printf("****************************************\n");
printf("\n");
printf("请输入你的需要:");
scanf("%d",&n);
printf("\n");
switch(n)
{
case 1:
display_car(park);
break;
case 2:
en_park(park);
break;
case 3:
{
if(park->car_num[park->front] == 0)
{
printf("场内没有车\n");
break;
}
int n;
int tm;
float t;
time_t lv_t;
float count;
printf("请输入你要开走的车辆的序号:");
scanf("%d",&n);
tm = leave_park(park,n,way);
lv_t = time(NULL);
count = (lv_t - tm) * M;
printf("您的车在本停车场内停放%d秒,共消费%5.2f元\n",lv_t - tm,count);
printf("\n");
if(wait->front->wn != 0)
{
wait_park(park);
if(wait->front == NULL)
{
wait ->front = (NODE_W *)malloc(sizeof(NODE));
}
}
}
break;
case 4:
{ int n;
printf("请输入你的车的停车序号:");
scanf("%d",&n);
search(park,n);
}
break;
case 5: display_wait(wait);
break;
case 6:
{
int n;
printf("请输入要离开的停车序号:");
scanf("%d",&n);
o_wait(n);
}break;
case 7:
exit(0);
break;
default : break;
}
}
return 0;
}
相关文章推荐
- 队列实现-停车场管理
- 【C语言】模拟狭窄停车场管理,使用栈和队列实现
- java栈+队列实现简单的停车场管理问题
- 栈和队列实现停车场(2)
- 用栈和队列实现虚拟停车场系统
- 实习二 栈、队列和递归算法设计 (题目:停车场管理 )
- 实验三 模拟饭堂排队打饭管理软件(循环队列实现)
- 停车场管理(栈和队列)
- 学习队列、栈的经典案例--Re:停车场管理模拟修改版
- 栈和队列实现的简易停车场
- Android Binder机制の设计与实现8-9(数据包接收队列与等待队列管理/总结)
- FUSE 内核实现代码分析(二) 队列管理
- 实验二:[栈和队列]停车场管理问题
- 停车场管理(栈和队列的应用)
- 停车场管理(栈和队列的应用)
- 栈和队列 实现停车场
- 停车场模拟管理程序的设计与实现
- 请实现一个队列,既可以存放整数,又可以存放字符串。简单的说,队列是一种数据结构,按照先进先出的顺序管理进、出队列的元素
- 停车场管理(栈与队列的应用)
- 请实现一个队列,既可以存放整数,又可以存放字符串。简单的说,队列是一种数据结构,按照先进先出的顺序管理进、出队列的元素