头文件Park.h
#ifndef _PARK_H_
#define _PARK_H_
#include <time.h>
#include <stdio.h>
#define SIZE 10
typedef enum {FALSE, TRUE} BOOL;
typedef enum {QUIT = '0', PARK, LEAVE, DISPLAY} COMMAND;
typedef struct _Data
{
int number; //停车号,从1000开始,每停入一辆车+1
struct tm time; //停入时间
}Data;
typedef struct _Node
{
Data data;
struct _Node *next;
}Node;
//以上为节点和节点数据类型定义
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//**********顺序栈***************
typedef struct Seq_Stack
{
Data data[SIZE];
int top;
}SeqStack;
// 初始化顺序栈
void SeqInit(SeqStack *s);
// 判断空顺序栈
BOOL SeqEmpty(SeqStack *s);
// 判断顺序栈满
BOOL SeqFull(SeqStack *s);
// 压顺序栈
void SeqPush(SeqStack *s, Data data);
// 出顺序栈
void SeqPop(SeqStack *s);
// 获取顺序栈顶数据
Data SeqGetTop(SeqStack *s);
//*********************************
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//**********链式栈***************
typedef struct Link_Stack
{
Node *top;
}LinkStack;
// 初始化链式栈
void LinkInit(LinkStack *s);
// 判断空链式栈
BOOL LinkEmpty(LinkStack *s);
// 压链式栈
void LinkPush(LinkStack *s, Data data);
// 出链式栈
void LinkPop(LinkStack *s);
// 获取链式栈顶数据
Data LinkGetTop(LinkStack *s);
//*********************************
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//**********队列***************
typedef struct _Queue
{
Node *front;
Node *rear;
}Queue;
//初始化队列
void QueueInit(Queue *q);
//判断空队列
BOOL QueueEmpty(Queue *q);
//入队列
void QueuePush(Queue *q, Data data);
//出队列
void QueuePop(Queue *q);
//获取队列头部数据
Data QueueGetTop(Queue *q);
//*********************************
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//**********停车场***************
typedef struct _Park
{
SeqStack *seqs;
LinkStack *links;
Queue *q;
}Park;
// 创建停车场并初始化
Park *ParkCreate();
//停入
void Parkin(Park *pa);
//离开
void Leave(Park *ps);
//打印单辆车信息
void Print_Data(Data data);
//显示停车场车辆
void Display(Park *pa);
//龙卷风摧毁停车场
void Destroy(Park *pa);
//*********************************
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
#endif //_PARK_H_
链式栈函数文件LinkStack.c
#include "Park.h"
#include <stdlib.h>
void LinkInit(LinkStack *s)
{
if (NULL == s)
return;
s->top = NULL;
}
BOOL LinkEmpty(LinkStack *s)
{
if (NULL == s)
return FALSE;
if (NULL == s->top)
return TRUE;
return FALSE;
}
void LinkPush(LinkStack *s, Data data)
{
if (NULL == s)
return;
Node *node = (Node *)malloc(sizeof(Node)/sizeof(char));
if (NULL == node)
return;
node->data = data;
node->next = s->top;
s->top = node;
}
void LinkPop(LinkStack *s)
{
if (NULL == s)
return;
if (LinkEmpty(s) == TRUE)
return;
Node *tmp = s->top;
s->top = tmp->next;
free(tmp);
}
Data LinkGetTop(LinkStack *s)
{
if (NULL == s)
return;
if (LinkEmpty(s) == TRUE)
{
printf("栈为空\n");
exit(-1); // 程序退出
}
return s->top->data;
}
顺序栈函数文件SeqStack.c
#include "Park.h"
#include <stdlib.h>
void SeqInit(SeqStack *s)
{
if(NULL == s)
return ;
s->top = -1;
}
BOOL SeqEmpty(SeqStack *s)
{
if(NULL == s)
return FALSE;
if(s->top == -1)
return TRUE;
else
return FALSE;
}
BOOL SeqFull(SeqStack *s)
{
if(NULL == s)
return FALSE;
if(s->top == SIZE-1)
return TRUE;
else
return FALSE;
}
void SeqPush(SeqStack *s, Data data)
{
if(NULL == s)
return ;
if(SeqFull(s) == TRUE)
return ;
s->data[++s->top] = data;
}
void SeqPop(SeqStack *s)
{
if(NULL == s)
return ;
if(SeqEmpty(s) == TRUE)
return ;
--s->top;
}
Data SeqGetTop(SeqStack *s)
{
if(NULL == s)
return ;
if(SeqEmpty(s) == TRUE)
{
printf("栈为空\n");
exit(-1);
}
return s->data[s->top];
}
链式队列函数 Queue.c
#include "Park.h"
#include <stdlib.h>
void QueueInit(Queue *q)
{
if(NULL == q)
return ;
q->front = NULL;
q->rear = NULL;
}
BOOL QueueEmpty(Queue *q)
{
if(NULL == q)
return FALSE;
if(q->front == NULL)
return TRUE;
return FALSE;
}
void QueuePush(Queue *q, Data data)
{
if(NULL == q)
return ;
Node *tmp = (Node *)malloc(sizeof(Node)/sizeof(char));
tmp->data = data;
tmp->next = NULL;
if(NULL != q->rear)
{
q->rear->next = tmp;
q->rear = tmp;
}
else
{
q->rear = tmp;
q->front = tmp;
}
}
void QueuePop(Queue *q)
{
if(NULL == q)
return ;
if(QueueEmpty(q) == TRUE)
return ;
Node *tmp = q->front;
q->front= tmp->next;
free(tmp);
if(q->front == NULL)
q->rear = NULL;
}
Data QueueGetTop(Queue *q)
{
if(NULL == q)
return ;
if(QueueEmpty(q) == TRUE)
{
printf("队列为空\n");
exit(-1);
}
return q->front->data;
}
停车场操作函数Park.c
#include <stdio.h>
#include <stdlib.h>
#include "Park.h"
int temp_number = 1000;
Park* ParkCreate()
{
//创建停车场
Park *pa = (Park *)malloc(sizeof(Park)/sizeof(char));
//创建并初始化停车栈
pa->seqs = (SeqStack *)malloc(sizeof(SeqStack)/sizeof(char));
SeqInit(pa->seqs);
//创建并初始化让车栈
pa->links = (LinkStack *)malloc(sizeof(LinkStack)/sizeof(char));
LinkInit(pa->links);
//创建并初始化等候队列
pa->q = (Queue *)malloc(sizeof(Queue)/sizeof(char));
QueueInit(pa->q);
return pa;
}
void Parkin(Park *pa)
{
if(NULL == pa)
return;
Data data;
data.number = temp_number+1;
time_t now;
time(&now);
data.time = *localtime(&now); //获取停入时间
//判断停车栈是否已满,未满则压入,已满则进入候车队列
if(!SeqFull(pa->seqs))
{
SeqPush(pa->seqs, data);
temp_number++;
printf("\t已为您自动生成停车号:%d\n", data.number);
printf("\t停车成功!\n");
}
else
{
QueuePush(pa->q, data);
temp_number++;
printf("\t已为您自动生成停车号:%d\n", data.number);
printf("\t停车场已满,进入等候队列,队列前还有%d辆车正在等候\t", data.number-QueueGetTop(pa->q).number);
}
}
void Leave(Park *pa)
{
if(NULL == pa)
{
return ;
}
int num; //要离开的停车号
system("clear");
Display(pa); //离开前先打印所有车
printf("\n");
printf("\t请输入要离开的停车号:");
scanf("%d", &num);
while(1)
{
//不停将栈顶车号与num匹配,同时出停车栈进入让车栈
if(SeqEmpty(pa->seqs)) //停车栈的车出完扔未匹配到num
{
printf("\t未找到该停车号\n");
break;
}
if(SeqGetTop(pa->seqs).number != num) //如果当前停车栈顶不匹配
{
LinkPush(pa->links, SeqGetTop(pa->seqs)); //停车栈栈顶元素压入让车栈
SeqPop(pa->seqs); //停车栈栈顶出栈
}
else
{
time_t now;
time(&now);
struct tm outime = *localtime(&now);
int hour = (outime.tm_hour)-(SeqGetTop(pa->seqs).time.tm_hour);
int min = (outime.tm_min)-(SeqGetTop(pa->seqs).time.tm_min);
int sec = (outime.tm_sec)-(SeqGetTop(pa->seqs).time.tm_sec);
int money = hour*3600 + min*60 + sec*1;
if(sec < 0)
{
sec += 60;
min--;
}
if(min < 0)
{
min += 60;
hour--;
}
printf("\t停车总时长为:%d小时%d分钟%d秒\n", hour, min, sec);
printf("\t收您停车费共%d元\n", money);
printf("\t停车号%d离开成功\n", num);
SeqPop(pa->seqs); //如果匹配成功,停车栈栈顶出栈,并退出循环
break;
}
}
while(!LinkEmpty(pa->links)) //让车栈栈顶循环压回停车栈
{
SeqPush(pa->seqs, LinkGetTop(pa->links));
LinkPop(pa->links);
}
if(!SeqEmpty(pa->seqs) && !QueueEmpty(pa->q)) //如果停车栈有车出栈(此时停车栈不满),且等候队列不为空
{
SeqPush(pa->seqs, QueueGetTop(pa->q)); //等候队列队头压入停车栈
QueuePop(pa->q); //等候队列队头出队列
}
}
void Print_Data(Data data)
{
printf("\t%d\t", data.number);
printf("\t%d时%d分%d秒\n", data.time.tm_hour, data.time.tm_min, data.time.tm_sec);
}
void Display(Park *pa)
{
if(NULL == pa)
return ;
system("clear");
if(SeqEmpty(pa->seqs))
{
printf("\t停车场为空\n\n");
}
else
{
printf("\t车位号\t\t停入时间\n");
}
//依次取出停车栈栈顶数据打印并暂时存入让车栈
while(!SeqEmpty(pa->seqs)) //停车栈为空时循环结束
{
Print_Data(SeqGetTop(pa->seqs)); //打印停车栈栈顶元素
LinkPush(pa->links, SeqGetTop(pa->seqs)); //将停车栈栈顶元素压入让车栈
SeqPop(pa->seqs); //停车栈出栈
}
//打印完后从让车栈取出并存回停车栈
while(!LinkEmpty(pa->links)) //让车栈为空时循环结束
{
SeqPush(pa->seqs, LinkGetTop(pa->links)); //将让车栈栈顶元素压入停车栈
LinkPop(pa->links); //让车栈出栈
}
printf("\n");
//判断等候队列是否为空
if(QueueEmpty(pa->q))
{
printf("\t等候队列无车辆\n");
}
else
{
//不为空则记录等候队列车辆数量
int count = 0; //等候队列车的数量
Data data = QueueGetTop(pa->q); //保存队列头部
QueuePush(pa->q, data); //队列头部的数据入队位
QueuePop(pa->q); //队头出队列
count++; //数量+1
//用保留的原队头匹配当前队头,相等则说明已经遍历完队列所有元素
while(QueueGetTop(pa->q).number != data.number)
{
QueuePush(pa->q, QueueGetTop(pa->q)); //队头入对位
QueuePop(pa->q); //队头出队列
count++;
}
printf("\t等候队列有%d辆车正在等候\n", count);
}
void Destroy(Park *pa)
{
if(NULL == pa)
return ;
while(!SeqEmpty(pa->seqs)) //清空停车栈元素
{
SeqPop(pa->seqs);
}
while(!LinkEmpty(pa->links)) //清空让车站元素
{
LinkPop(pa->links);
}
while(!QueueEmpty(pa->q)) //清空等候队列元素
{
QueuePop(pa->q);
}
free(pa->seqs); //释放停车栈空间
free(pa->links); //释放让车栈空间
free(pa->q); //释放等候队列空间
free(pa); //龙卷风摧毁停车场
}
}
菜单函数menu.c
#include <stdio.h>
#include <stdlib.h>
#include “Park.h”
//菜单
void menu()
{
Park *pa = ParkCreate(); //创建停车场并初始化,返回地址用指针Pa接收
char com = 0;
while(1)
{
system("clear");
printf("\t*********************************\n");
printf("\t*\t1.停车\t\t\t*\n");
printf("\t*\t2.离开\t\t\t*\n");
printf("\t*\t3.显示停车场情况\t*\n");
printf("\t*\t0.退出程序\t\t*\n");
printf("\t*********************************\n");
printf("\t请输入要执行的操作:");
scanf("%c", &com);
switch(com)
{
case PARK:
Parkin(pa);
break;
case LEAVE:
Leave(pa);
break;
case DISPLAY:
Display(pa);
break;
case QUIT:
Destroy(pa);
printf("\t感谢使用!\n");
return ;
default:
printf("\t操作指令有误\n");
break;
}
printf("\n");
printf("\t按回车键返回主菜单\n");
getchar();
getchar();
}
}
main函数main.c
int main()
{
menu();
return 0;
}