停车场

Stack.h

#ifndef _STACK_H_
#define _STACK_H_


#define SIZE 10


typedef enum {FALSE, TRUE}  BOOL;


//顺序栈---------------------------------------
typedef struct data
{
	char plate[10];
	int t_year;
	int t_mon;
	int t_day;
	int t_hour;
	int t_min;
	int t_sec;
	time_t start_sec;
	
}Data;
typedef struct stack
{
	Data data[SIZE];         // 栈存储空间
	int top; // 栈顶元素的下标
}Stack;


// 初始化栈
void Init1(Stack *s);

//判断空栈
BOOL Empty1(Stack *s);

//判断满栈
BOOL Full1(Stack *s);



//入栈
void Push1(Stack *s,Data data);

//出栈
void Pop1(Stack *s);

//获取栈顶元素
Data GetTop1(Stack *s);


//---------------------------------------------------
//链式队列
typedef struct node
{
	char num[10];         // 队列存储空间
	struct node *next; // 
}Node;

typedef struct queue
{
	Node *front;
	Node *rear;
}Queue;


// 初始化队列
void Init2(Queue *q);

//判断空队列
BOOL Empty2(Queue *q);


//入队列
void Push2(Queue *q,char num[]);

//出队列
void Pop2(Queue *q);

//
char* GetTop2(Queue *q);


#endif

main.c

#include <stdio.h>
#include <string.h>
#include <string.h>
#include <time.h>
#include "Stack.h"

enum menu{PARK = '1', EXIT, DISPLAY, QUIT };

int len(Queue q)
{
	int count=0;
	while(q.front!=NULL)
	{
		count++;
		q.front=q.front->next;
	}
	return count;
}

/* int len(Queue *q)错误!!!通过指针间接访问->修改了front指向,一直指到了末尾,gettop()时,获得了最后一个元素,前面的都没了
{
	int count=0;如果这样传,需要重新定义一个Node *tmp来操作
	while(q->front->next!=NULL)
	{
		count++;
		q->front=q->front->next;
	}
	return count;
}	  */

void park(Stack *s,Queue *q)
{
	if(Full1(s)==TRUE)
	{
		char num[10];
		printf("请输入车牌号\n");
		scanf("%s",num);
		getchar();
		Push2(q,num);//车库满了,进等待队列
		printf("%s\n",GetTop2(q));
		printf("88\n");
		
		/* while(q->front!=NULL)
		{
			printf("%s\n",q->front->num);
			q->front=q->front->next;
		} */
		int count=len(*q)-1;
		printf("车库已满,您的车在等候区等候,您的前面有%d人\n",count);
	}
	else
	{
		Data data;
		printf("请输入车牌号\n");
		scanf("%s",data.plate);
		getchar();
		
		time_t t;
		struct tm * lt;
		// 获取Unix时间戳
		time (&t);
		data.start_sec=t;
		// 转为时间结构
		lt = localtime (&t);
		
		// 输出结果
		//printf ( "%d/%d/%d %d:%d:%d\n",lt->tm_year+1900, lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);
		data.t_year = lt->tm_year+1900;
		data.t_mon = lt->tm_mon + 1;
		data.t_day = lt->tm_mday;
		data.t_hour = lt->tm_hour;
		data.t_min = lt->tm_min;
		data.t_sec = lt->tm_sec;

		Push1(s , data);
		system("clear");
		printf("停车成功!\n");
	}
}

void Exit(Stack *s1,Stack *s2,Queue *q)
{
	printf("请输入你的车位号\n");
	int num;
	Data data;
	
	scanf("%d",&num);
	getchar();
	//printf("top:%d\n",s->top);
	
	while(num < (s1->top)+1)
	{
		data=GetTop1(s1);
		Push1(s2,data);
		Pop1(s1);
		//printf("3\n");
	}
	
	if(num == (s1->top)+1)
	{
		data = GetTop1(s1);
		time_t t;
		//struct tm * lt;
		// 获取Unix时间戳
		time (&t);
		time_t all_t = t - data.start_sec;
		//double cost = difftime(t, data.start_sec);
		printf("车位号:%d\t",s1->top+1);
		printf("车牌号: %s\t",s1->data[s1->top].plate);
		printf("停车时长:%ld s\t",all_t);
		printf ("入库时间:%d/%d/%d %d:%d:%d\n",s1->data[s1->top].t_year, s1->data[s1->top].t_mon,s1->data[s1->top].t_day, s1->data[s1->top].t_hour, s1->data[s1->top].t_min, s1->data[s1->top].t_sec);
		Pop1(s1);
		printf("您已成功出库,欢迎下次光临!\n");
		

		while(Empty1(s2) == FALSE)//把让路栈的车返回到车库
		{
			data = GetTop1(s2);
			Push1(s1,data);
			Pop1(s2);
		}
		
		if(Empty2(q) == FALSE)//等候区有车,就把第一辆车移到车库
		{//char num[10]=GetTop2(q);
		printf("%s\n",GetTop2(q));	
		strcpy(data.plate,GetTop2(q));//获取等候区第一辆车
		
		time_t t2;
		struct tm * lt;
		// 获取Unix时间戳
		time (&t2);
		data.start_sec = t2;
		// 转为时间结构
		lt = localtime (&t2);
	
		//strcpy(data.plate,num);
		data.t_year = lt->tm_year+1900;
		data.t_mon = lt->tm_mon + 1;
		data.t_day = lt->tm_mday;
		data.t_hour = lt->tm_hour;
		data.t_min = lt->tm_min;
		data.t_sec = lt->tm_sec;

		Push1(s1 , data);//将等候区第一辆车压栈进入车库
		printf("车牌号%s停车成功!\n",GetTop2(q));
		Pop2(q);//将第一辆车移出等候队列
		}
		
	}

}

void Display(Stack *s,Queue *q)
{
	
	time_t t;
	int i=s->top;
	while(i!=-1)
	{
		
		time (&t);
		time_t all_t = t - s->data[i].start_sec;
		
		printf("车位: %d\t",i+1);
		printf("车牌号:%s\t",s->data[i].plate);
		printf ("入库时间:%d/%d/%d %d:%d:%d\t",s->data[i].t_year, s->data[i].t_mon,s->data[i].t_day, s->data[i].t_hour, s->data[i].t_min, s->data[i].t_sec);
		printf("停车时长:%ld s\n",all_t);
		i--;
	}
	int count;
/* 	while(q->front!=NULL)
	{
		printf("%d : %s\n",count,q->front->num);
		q->front=q->front->next;
	} */
}



int main()
{
	Stack s1;
	Init1(&s1);
	Stack s2;
	Init1(&s2);
	Queue q;
	Init2(&q);
	char order[10];
	
	
	while(1)
	{
		int count=len(q)-1;
		int i=SIZE-(s1.top)-1;
		system("clear");
		printf("*****************目前停车场状况***********************\n");
		printf("***************当前车库还剩%d个车位********************\n",i);
		printf("***************等候区有%d辆车在等候********************\n",count+1);
		printf("--------------Welcome to Our Parking------------------\n");
		printf("                 1、停车                              \n");
		printf("                 2、离开                              \n");
		printf("                 3、查看停车场停车状况                \n");
		printf("                 4、退出                              \n");
		printf("------------------------------------------------------\n");
		
		fgets(order,10, stdin);
		system("clear");
		switch(order[0])
		{
			case PARK:
				park(&s1,&q);
				break;
 			case EXIT:
				Exit(&s1,&s2,&q);
				break;
			case DISPLAY:
				Display(&s1,&q);
				break;
			case QUIT:
				return;
	
			default:
				printf("输入错误,请重新输入!\n");
				break;
		}
		printf ("\t\t按Enter键返回\n");
		getchar();
	}

	
		return 0;
}

Stack.c

#include <time.h>
#include "Stack.h"
#include <stdlib.h>
#include <string.h>

//顺序栈------------------------------------
void Init1(Stack *s)
{
	if (NULL==s)
		return;
	
	s->top=-1;
}

BOOL Empty1(Stack *s)
{
	if (NULL==s)
		return;
	
	if(s->top==-1)
		return TRUE;
	return FALSE;
}

BOOL Full1(Stack *s)
{
	if (NULL==s)
		return;
	
	if(s->top==SIZE-1)
		return TRUE;
	return FALSE;
}

void Push1(Stack *s,Data data)
{
	if (NULL==s)
		return;
	if(TRUE==Full1(s))
		return;
	
	s->data[++s->top]=data;
}

void Pop1(Stack *s)
{
	if (NULL==s)
		return;
	if(TRUE==Empty1(s))
		return;
	
	s->top--;
}

Data GetTop1(Stack *s)
{
	if (NULL==s)
		return;
	
	if(TRUE==Empty1(s))
		exit(-1);
	return s->data[s->top];
}


//链式队列---------------------------------------
void Init2(Queue *q)// 初始化队列
{
	if (NULL==q)
		return;
	
	q->front=NULL;
	q->rear=NULL;
}

BOOL Empty2(Queue *q)//判断空队列
{
	if (NULL==q)
		return FALSE;
	
	if(q->front==NULL)
		return TRUE;
	
	return FALSE;
}



void Push2(Queue *q,char num[])//入队列
{
	if (NULL==q)
		return;
	
	Node *node =(Node *)malloc(sizeof(Node)/sizeof(char));
	
	if(node==NULL)
		return;
	
	strcpy(node->num,num);
	node->next=NULL;
	if(q->rear!=NULL)
	{
		q->rear->next=node;
		q->rear=node;
	}
	else
	{
		q->rear=node;
		q->front=node;
	}
	
}

void Pop2(Queue *q)//出队列
{
	if (NULL==q)
		return;
	
	if(TRUE==Empty2(q))
		return;
	
	Node *tmp=q->front;
	q->front=tmp->next;
	free(tmp);
	
	if(q->front==NULL)
	{
		q->rear=NULL;
	}
}

char *GetTop2(Queue *q)//获取队列顶元素
{
	if (NULL==q)
		return;
	
	if(TRUE==Empty2(q))
		exit(-1);
	
	return q->front->num;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值