停车场1.0

头文件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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值