项目目的:为了深入理解队和栈的使用原理,利用一个栈两个队列简单实现停车场的管理。
Parking.h 文件:
#ifndef __PARKING_H__
#define __PARKING_H__
#define TRUE 1
#define FALSE 0
#define SIZE 20
#define TIME 86400
/*
停车场管理
问题描述:停车场是一个能放n辆车的狭长通道,只有一个大门,
汽车按到达的先后次序停放。若车场满了,车要停在门外的便道上等候,
一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,
由于通道窄,在它后面的车要先退出,待它走后在依次进入。
汽车离开时按停放时间收费。
基本功能要求:
(1) 建立三个数据结构分别是:停放队列、让路栈、等候队列。
(2) 输入数据模拟管理过程,数据(入或出,车号)。停车场管理
问题描述:停车场是一个能放n辆车的狭长通道,只有一个大门,
汽车按到达的先后次序停放。若车场满了,车要停在门外的便道上等候,
一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,
由于通道窄,在它后面的车要先退出,待它走后在依次进入。
汽车离开时按停放时间收费。
基本功能要求:
(1) 建三个数据结构分别是:停放队列、让路栈、等候队列。
(2) 输入数据模拟管理过程,数据(入或出,车号)。
*/
typedef struct _information
{
int id;
char name[SIZE];
char number[SIZE];
int parktime;
}ParkData;
//停放队列
typedef struct park_queue
{
ParkData data[SIZE];
int front; // 指向队头下标
int rear; // 指向队尾下标
}Park_Queue;
// 置空队
int InitPark_Queue (Park_Queue *q);
// 停放队列进队
int EnPark_Queue (Park_Queue *q, ParkData x);
// 停放队列出队
int DePark_Queue (Park_Queue *q, ParkData *x);
// 判停放队列空否
int Park_QueueEmpty (Park_Queue *q);
// 判停放队列满否
int Park_QueueFull (Park_Queue *q);
// 取停放队列队头
int GetFront_Park (Park_Queue *q, ParkData *x);
//让路栈
typedef struct _node
{
ParkData data;
struct _node *next;
}Node;
typedef struct way_stack
{
Node *top;
}Way_Stack;
// 创建让路栈
Way_Stack *Create_Stack();
// 判让路栈空否
int StackEmpty (Way_Stack *s);
// 进让路栈
int Push (Way_Stack *s, ParkData x);
// 出让路栈
int Pop (Way_Stack *s, ParkData *x);
// 获取让路栈顶元素
int GetTop (Way_Stack *s, ParkData *x);
// 销毁让路栈
int Destroy(Way_Stack *s, Park_Queue *q);
//等候队列
typedef struct wait_node
{
ParkData data;
struct wait_node *next; // 指向下一个结点
}Wait_Node;
typedef struct wait_queue
{
Wait_Node *front;
Wait_Node *rear;
}Wait_Queue;
// 候车队
Wait_Queue* Create_Queue();
// 候车队是否为空
int QueueEmpty (Wait_Queue *w);
// 候车队进队
int EnQueue (Wait_Queue *w, ParkData x);
// 候车队出队
int DeQueue (Wait_Queue *w, ParkData *x);
// 停车场情况显示
int Display (Park_Queue *q, Wait_Queue *w);
// 停车休息!
int Park (Park_Queue *q, Wait_Queue *w, ParkData *data);
// 老司机开车了,劳资要出去浪啦!
int Leave (Park_Queue *q, Wait_Queue *w);
// 寻找停车队下标
// tmp 需要出队的 id号, count是要找到元素的队列下标
int FindData(Park_Queue *q, int tmp, int *count);
#endif //__PARKING_H__
#include "Parking.h"
#include
#include
#include
Interface_Display ()
{
system ("clear");
printf ("\t********************************************************\n");
printf ("\t*------------------------------------------------------*\n");
printf ("\t******* Welcome To Yangzi's Parking Lot! *********\n");
printf ("\t* 1、停车 *\n");
printf ("\t* 2、离开 *\n");
printf ("\t* 3、查看停车场情况 *\n");
printf ("\t* 4、退出 *\n");
printf ("\t* *\n");
printf ("\t* *\n");
printf ("\t* 制作人: 陈阳 *\n");
printf ("\t* *\n");
printf ("\t*------------------------------------------------------*\n");
printf ("\t********************************************************\n");
}
// 停放队列置空队
int InitPark_Queue (Park_Queue *q)
{
if (q == NULL)
return FALSE;
//置空队
q->front = 0;
q->rear = 0;
return TRUE;
}
// 停放队列进队
int EnPark_Queue (Park_Queue *q, ParkData x)
{
if (q == NULL)
return FALSE;
if (Park_QueueFull(q))
return FALSE;
q->rear = (q->rear+1) % SIZE;
q->data[q->rear] = x;
return TRUE;
}
// 停放队列出队
int DePark_Queue (Park_Queue *q, ParkData *x)
{
if (q == NULL )
{
return FALSE;
}
if (Park_QueueEmpty(q))
{
return FALSE;
}
q->front = (q->front + 1) % SIZE;
*x = q->data[q->front];
return TRUE;
}
// 判停放队列空否
int Park_QueueEmpty (Park_Queue *q)
{
if (q == NULL)
return FALSE;
return q->front == q->rear;
}
// 判停放队列满否
int Park_QueueFull (Park_Queue *q)
{
if (q == NULL)
return FALSE;
return q->front == (q->rear+1)%SIZE;
}
// 取停放队列队头
int GetFront_Park (Park_Queue *q, ParkData *x)
{
if (q == NULL || x == NULL)
{
return FALSE;
}
if (Park_QueueEmpty (q))
{
return FALSE;
}
int index = (q->front+1)%SIZE;
*x = q->data[index];
return TRUE;
}
// 创建让路栈
Way_Stack *Create_Stack()
{
Way_Stack* s = (Way_Stack*)malloc(sizeof(Way_Stack)/sizeof(char));
if (s == NULL)
return NULL;
// 置空栈
s->top = NULL;
return s;
}
// 让路栈是否为空
int StackEmpty (Way_Stack *s)
{
if (s == NULL)
return FALSE;
return s->top == NULL;
}
// 进入让路栈
int Push (Way_Stack *s, ParkData x)
{
if (s == NULL)
return FALSE;
// 新建结点
Node* node = (Node*)malloc(sizeof(Node)/sizeof(char));
if (node == NULL)
return FALSE;
node->data = x;
node->next = s->top;
s->top = node;
return TRUE;
}
// 出让路栈
int Pop (Way_Stack *s, ParkData *x)
{
if (s == NULL)
return FALSE;
if (StackEmpty(s))
return FALSE;
Node *p = s->top;
*x = p->data;
s->top = p->next;
free(p);
return TRUE;
}
// 获取让路栈顶元素
int GetTop (Way_Stack *s, ParkData *x)
{
if (s == NULL)
return FALSE;
if (StackEmpty(s))
return FALSE;
*x = s->top->data;
return TRUE;
}
// 销毁让路栈并将数据返回停车队
int Destroy(Way_Stack *s, Park_Queue *q)
{
if (s == NULL || q == NULL)
return FALSE;
ParkData x;
while(StackEmpty(s) != TRUE)
{
Pop (s, &x);
EnPark_Queue (q, x);
}
free(s);
return TRUE;
}
// 创建候车队
Wait_Queue* Create_Queue()
{
Wait_Queue *w = (Wait_Queue*)malloc(sizeof(Wait_Queue)/sizeof(char));
if (w == NULL)
return FALSE;
w->front = NULL;
w->rear = NULL;
return w;
}
// 候车队是否为空
int QueueEmpty (Wait_Queue *w)
{
if (w == NULL)
return FALSE;
return w->front == NULL;
}
// 候车队进队
int EnQueue (Wait_Queue *w, ParkData x)
{
if (w == NULL)
return FALSE;
Wait_Node *node = (Wait_Node*)malloc(sizeof(Wait_Node)/sizeof(char));
if (node == NULL)
return FALSE;
node->data = x;
node->next = NULL;
if (w->front == NULL)
{
w->front = node;
w->rear = node;
}
else
{
w->rear->next = node;
w->rear = node;
}
return TRUE;
}
// 候车队出队
int DeQueue (Wait_Queue *w, ParkData *x)
{
if (w == NULL)
return FALSE;
if (QueueEmpty (w))
return FALSE;
Wait_Node *p = w->front;
*x = p->data;
w->front = p->next;
free(p);
if (w->front == NULL)
w->rear = NULL;
return TRUE;
}
// 停车场情况显示
int Display (Park_Queue *q, Wait_Queue *w)
{
if (q == NULL || w == NULL)
return FALSE;
if (Park_QueueEmpty (q))
{
printf ("停车场为空!\n");
return TRUE;
}
printf ("\t*************************停车列表*************************\n");
ParkData x;
int index = q->front;
do
{ index++;
x = q->data[index%SIZE];
printf ("\t 停车号:%d, 姓名:%s, 车牌号:%s, 停车时间: %d秒 \n ", x.id, x.name, x.number, time(NULL)%TIME - x.parktime);
}while (index != q->rear);
printf ("\t*************************候车列表*************************\n");
if (QueueEmpty (w))
{
printf ("候车队为空\n");
return TRUE;
}
Wait_Node *tmp = w->front; //指向候车队队头
x = tmp->data;
printf ("\t 停车号:%d, 姓名:%s, 车牌号:%s, 候车时间: %d秒\n", x.id, x.name, x.number, time(NULL)%TIME - x.parktime);
while (tmp != w->rear)
{
tmp = tmp->next;
x = tmp->data;
printf ("\t 停车号:%d, 姓名:%s, 车牌号:%s, 候车时间: %d秒\n", x.id, x.name, x.number, time(NULL)%TIME - x.parktime);
};
return TRUE;
}
// 老司机开车了,劳资要出去浪啦!
int Leave (Park_Queue *q, Wait_Queue *w)
{
if (q == NULL || w == NULL)
return FALSE;
if (Park_QueueEmpty (q))
return FALSE;
ParkData x;
int t;
printf ("请输入离开车辆id :");
scanf ("%d", &t);
time_t Time = time(NULL); //获取当前时间
GetFront_Park (q, &x); //取停车队队首
//若离开车辆在队头,则直接出队
if (t == x.id) //x 现在为队首数据
{
DePark_Queue (q, &x);
printf ("离开成功!\n");
printf ("\t现在时间:%s", ctime(&Time));
if (QueueEmpty (w))
{
return TRUE;
}
else // 候车队队头进停车队
{
DeQueue (w, &x);
x.parktime = time(NULL); //此时x接收到了候车队抛出的队首数据,并将停车时间初始化
EnPark_Queue (q, x); //该数据进入停车队
}
}
//若离开的车辆不在队头,遍历整个停车队列,找到该车
else
{
//创建让路栈
Way_Stack *s = Create_Stack();
if (s == NULL)
{
printf ("让路栈创建失败!\n");
Destroy(s, q);
return FALSE;
}
int count = 0;
if (FindData(q, t, &count) == FALSE)
{
printf ("您输入的id号不在停车场\n");
Destroy(s, q);
return;
}
// 找到id,将该车前面的车放入让车栈,然后离开,再让让车栈的车返回停车队
else
{
int i = 0;
for (i = 0; i < count - 1; i++)
{
DePark_Queue (q, &x);
Push (s, x);
}
DePark_Queue (q, &x); //该车出停车队
Destroy(s, q); //销毁让路栈并让让路栈的车回停车队
printf ("离开成功!\n");
printf ("\t现在时间:%s", ctime(&Time));
if (QueueEmpty (w))
{
return TRUE;
}
else
{
DeQueue (w, &x);
x.parktime = time(NULL);
EnPark_Queue (q, x);
}
}
}
return TRUE;
}
// 寻找停车队下标
int FindData(Park_Queue *q, int tmp, int *count)
{
if (q == NULL || count == NULL)
return FALSE;
int flag = 0;
ParkData x;
int index = q->front;
do
{
index++;
(*count)++;
index = index % SIZE;
x = q->data[index];
if (tmp-1 == x.id)
{
flag = 1;
break;
}
}while (index != q->rear);
return flag;
}