停车场

停车场项目需求

问题描述:停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门
          外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车
          要先退出,待它走后在依次进入。汽车离开时按停放时间收费。
基本功能要求:
          (1)建立三个数据结构分别是:停放栈、让路栈、等候队列。
          (2)输入数据模拟管理过程,数据(入或出,车号)

功能描述:进车登记、出车登记、按车牌号查询停车车辆信息、查询出入车记录、
          查询场内车辆信息、查询等候车辆信息、退出系统。
          (1)linux系统编写(链表、栈、队列);
          (2)进车登记:登记车牌号以及入场时间;                              (进栈时)                
          (3)出车登记:计算出停车时间,记录车辆车牌;                        (出栈时)
      (4)按车牌号查询车辆信息:停车时间,是否来过停车场,是否还在停车场  (链表中查找)
          (5)查询出入记录:所有车辆,包括已经离开的                          (链表中查找)   
          (6)查询场内车辆信息:列出所有场内车辆信息                          (链表中查找)
      (7)查询等候车辆信息:显示等候车辆数量以及所有车牌号                (等待队列中查询)
      (8)退出系统。

项目分析:
两个栈,1、停放栈(车牌号,出场时间,入场时间)[初始化,判断是否为空,出栈,入栈,查栈]
        
    2、让路栈(车牌号)[初始化,出栈,入栈,判断是否为空]
        
        一个队列,[初始化,出队列,入队列](车牌号)
        
        一个链表,(车牌号,出入厂状态,入场时间,出场时间)[初始化,入链表,查找数据,遍历打印]
        
    一个结构体数组存场内车辆(车牌号,入场时间)[增添数据,删除数据,打印所有数据。]

// 头文件
#ifndef _PARK_H
#define _PARK_H

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define SUCCESS 10001
#define FAILURE 10002
#define TRUE    10003
#define FALSE   10004
#define SIZE    5

struct list
{
    char plate[10];
    char sit[10];
    time_t T1;   // 入场时间
    time_t T2;   // 出场时间

    struct list *next;
};
typedef struct list L;             // ----------------------- list ---------------//

struct info
{
    char plate[10];  // 栈的信息,车牌
};
typedef struct info SI;

struct Seqstack
{
    int top;  // 栈顶
    SI *data;
};
typedef struct Seqstack ST;    // ---------------- stack -----------------//

struct wait    // 等待队列的信息
{
    char plate[10];    // 车牌
    struct wait *next;
};
typedef struct wait node;

struct linkqueue  // 队列
{
    node *front;   // 队头指针
    node *rear;    // 队尾指针
};
typedef struct linkqueue Q;              // -----------------  queue -------------//

void menu();                             // ------ 操作显示函数 ------//
int listInit(L **l);                     // ------ 链表初始化 -------//
int stackInit(ST **s);                   // ------ 栈的初始化 -------//
int Initqueue(Q **q);                    // ------ 队列初始化 -------//
int push(ST *s,char *p);                 // ------ 入栈 ----------//
int Enterqueue(Q *q,char *p);            // ------ 入队 ----------//
int Getfull(ST *s);                      // ------ 判断栈是否存满 -----//

int listInsert(L *l,char nam[],time_t t1,time_t t2); // --- 插入链表 ------- //
int stackEmpty(ST *s);                   // ---    栈空不空    --------------//
int pop(ST *s,char **e);                 // ----------  出栈 ----------------//
int Gettop(ST *s);                       // ----------  得到top大小  --------// 
int EmptyQueue(Q *q);                    // ----------  空队  ---------------//
int DeleteQueue(Q *q,char **e);          // ----------- 出队  ---------------//
int car_in(L *l,ST *s,Q *q);             // ----------- 进车登记 ------------//
int car_out(L *l, ST *s1, ST *s2, Q *q); // ----------- 出车登记 ------------//
int find_car(L *l);   // 查询一辆车
int all_car(L *l);    // 出入记录
int car_park(L *l);   // 查询场内所有车
int car_wait(Q *q);   // 查询等候的所有车辆

#endif

// 测试文件
#include "park.h"

int main()
{
    char ch;
    int ret,n = 0;
    L *l;
    ST *s1,*s2;
    Q *q;
	
    ret = listInit(&l);
    if(FAILURE == ret)
    {
        printf("Init list Failure!\n");
    }
    if(stackInit(&s1) != SUCCESS || stackInit(&s2) != SUCCESS)
    {
        printf("Init stack Failure!\n");
    }
    ret = Initqueue(&q);
    if(ret == FAILURE)
    {
        printf("Init queue Failure!\n");
    }
    while(1)
    {
	    menu();
        printf("请输入你的选择: ");
        scanf(" %c",&ch);
        switch(ch)
        {
            case '1':
                {
                    ret = car_in(l,s1,q);
                    if(ret == FAILURE)
                    {
                        printf("进车登记失败\n");
                    }
                    else
                    {
                        printf("进车登记成功\n");
                    }
                }
				sleep(3);
                break;
			case '2':
                {
                    ret = car_out(l,s1,s2,q);
				    if(ret == FAILURE)
				    {
					    printf("出车登记失败\n");
				    }
					else
                    {
                        printf("出车登记成功\n");
                    }
                }
				sleep(3);
                break;
			case '3':
				ret = find_car(l);
				if(ret == FAILURE)
				{
					printf("查询车辆失败\n");
				}
				else
				{
					printf("查询车辆成功\n");
				}
				sleep(3);
				break;
			case '4':
				ret = all_car(l);
				if(ret == FAILURE)
				{
					printf("查询出入记录失败\n");
				}
				else
				{
					printf("查询出入记录成功\n");
				}
				sleep(3);
				break;
			case '5':
				ret = car_park(l);
				if(ret == FAILURE)
				{
					printf("查询场内车辆失败\n");
				}
				else
				{
					printf("查询场内车辆成功\n");
				}
				sleep(3);
				break;
			case '6':
				ret = car_wait(q);
				if(ret == FAILURE)
				{
					printf("查询等待车辆失败\n");
				}
				else
				{
					printf("查询等待车辆成功\n");
				}
				sleep(3);
				break;			
            case '0':
                printf("欢迎下次使用!\n");
                break;
            default :
                printf("输入有误,请重新输入!\n");
                break;
        }
        if('0' == ch)
        {
            printf("确定退出?确定请输入 1,否则请输 0\n");
            scanf("%d",&n);
            if(1 == n)
            {
                break;
            }
        }
    }	
    return 0;
}



// 功能函数文件
#include "park.h"

void menu()                          // - - - - - -  操作显示函数  - - - - - - - - //
{
    printf("==========================================\n");
    printf("===                菜单                ===\n");
    printf("==========================================\n");
    printf("===                                    ===\n");
    printf("===        0 : 退出系统                 ===\n");
    printf("===        1 : 进车登记                 ===\n");
    printf("===        2 : 出车登记                 ===\n");
    printf("===        3 : 查询车辆信息              ===\n");
    printf("===        4 : 查询出入记录              ===\n");
    printf("===        5 : 查询场内车辆信息          ===\n");
    printf("===        6 : 查询等候车辆信息          ===\n");   
    printf("===                                    ===\n");
    printf("==========================================\n");
    printf("===        wcn           201808        ===\n");
    printf("==========================================\n");
}

int listInit(L **l)                 // - - - - - - -  链表初始化 - - - - - ---- - //
{
    *l = (L *)malloc(sizeof(L)*1);
    if( NULL == (*l) )
    {
        return FAILURE;
    }
    (*l)->next = NULL;
    return SUCCESS;
}

int stackInit(ST **s)               // - - - - - - - 栈的初始化 - - - - - - - - - //
{
    (*s) = (ST *)malloc(sizeof(ST)*1);
    if( NULL == (*s) )
    {
        return FAILURE;
    }
    (*s)->top = -1;
    (*s)->data = (SI *)malloc(sizeof(SI)*10);
    if( NULL == (*s)->data )
    {
        return FAILURE;
    }
    return SUCCESS;
}

int Initqueue(Q **q)                 // - - - - - - -  队列初始化  - - - - - - -  //
{
    *q = (Q *)malloc(sizeof(Q)*1);
    if( NULL == (*q) )
    {
        return FAILURE;
    }
    node *p = (node *)malloc(sizeof(node)*1);
    if(NULL == p)
    {
        return FAILURE;
    }
    p->next = NULL;
    (*q)->front = (*q)->rear = p;
    return SUCCESS;
}

int push(ST *s,char *p)                          // - -  - 入栈 - - -- - //
{
    if(NULL == s)
    {
        return FAILURE;
    }
    s->top++;
    strcpy(s->data[s->top].plate,p);
    return SUCCESS;
}

int Enterqueue(Q *q,char *p)                      // - - - 入队 - - -- - //
{
    if(NULL == q)
    {
        return FAILURE;
    }
    node *r = (node *)malloc(sizeof(node)*1);
    if(NULL == r)
    {
        return FAILURE;
    }
    strcpy(r->plate,p);
    r->next = NULL;
    q->rear->next = r;
    q->rear = r;
    return SUCCESS;
}

int Getfull(ST *s)                                 // - - - 判断栈是否存满 - - // 
{
    return (s->top == SIZE -1)? TRUE:FALSE;
}

int listInsert(L *l,char nam[],time_t t1,time_t t2) // - - - 插入链表 - - - - //
{
    L *r,*p = l;
    if(NULL == l)
    {
        return FAILURE;
    }
  
    r = (L *)malloc(sizeof(L)*1);
    if(NULL == r)
    {
        return FAILURE;
    }
    strcpy(r->plate,nam);
    strcpy(r->sit,"在场内");
    r->T1 = t1;
    r->T2 = t2;
	r->next = p->next;
    p->next = r;
    
    return SUCCESS;
}

int stackEmpty(ST *s)                              // --- 栈空不空    --------//
{
    return (s->top == -1)? TRUE:FALSE; 
}

int pop(ST *s,char **e)                              //       出栈            //
{
    if(s->top == -1 || NULL == s)
    {
        return FAILURE;
    }
	*e = (char *)malloc(sizeof(char)*10);
	if(NULL == (*e))
	{
		return FAILURE;
	}
	strcpy(*e,s->data[s->top].plate);
	s->top--;
	return SUCCESS;   
}

int Gettop(ST *s)                                  // - -  得到top值 - - - - // 
{
    if(s->top == -1 || NULL == s)
    {
        return FAILURE;
    }
    else
    {
        return s->top;
    }
}

int EmptyQueue(Q *q)                              // - - -   空队 - - - - - //
{
    if(q==NULL)
	{
	   return FAILURE;
	}
	return (q->front == q->rear)? TRUE:FALSE;
}

int DeleteQueue(Q *q,char **e)                     // - - - - -- 8出队  - - - //
{
	node *p = q->front->next;               // 队节点
	if (NULL == q )  // 入参判断    并判断是否为空队列
	{
		return FAILURE;
	}
	*e = (char *)malloc(sizeof(char)*10);
	if(NULL == (*e))
	{
		return FAILURE;
	}
	strcpy(*e,p->plate);   //  
	q->front->next = p->next;
	if (NULL == p->next)
	{
		q->rear = q->front;
	}
	free(p);
	return SUCCESS;
}

int out(L *l,ST *s1,ST *s2,char *nam)  // 出停栈,比对成功链表记,入让栈
{
	time_t t;
	char *p;
	int k = 0;
	L *r = l->next;
	if(l == NULL || NULL == s1 || s2 == NULL)
	{
		return FAILURE;
	}
	while(stackEmpty(s1) != TRUE)
	{
		pop(s1,&p);
		if(strcmp(p,nam) == 0)
		{
			break;
		}
		else
		{
			push(s2,p);
		}
	}
	while(r)
	{
		if(strcmp(r->plate,nam) == 0)
		{
			time(&t);
			strcpy(r->sit,"已离开");
			r->T2 = t;
			break;
		}
		r = r->next;
	}
	if(r == NULL)
	{
		printf("车场内没有来过此车\n");		
	}
	return SUCCESS;
}
int out1(ST *s1,ST *s2)  // 出让栈,空停止,入停栈
{
	char *p;
	int ret;
	if(NULL == s1 || s2 == NULL)
	{
		return FAILURE;
	}
	while(stackEmpty(s2) != TRUE)
	{
		ret = pop(s2,&p);  // 获取p
		if(FAILURE == ret)
		{
			return FAILURE;
		}
		ret = push(s1,p);  // p入栈
		if(ret == FAILURE)
		{
			return FAILURE;
		}
	}
	return SUCCESS;
}
int out2(L *l,ST *s,Q *q)   // 停栈不满队来补满
{
	time_t t1,t2;
	char *a;
	int ret;
	while(Getfull(s) != TRUE && EmptyQueue(q) != TRUE)
	{
		time(&t1);
		ret = DeleteQueue(q,&a);
		if(FAILURE == ret)
		{
			return FAILURE;
		}
		ret = push(s,a);
		if(FAILURE == ret)
		{
			return FAILURE;
		}
		ret = listInsert(l,a,t1,t2);
		if(FAILURE == ret)
		{
			return FAILURE;
		}
	}
	return SUCCESS;
}

// -------------- 6大功能区 ----------//
int car_in(L *l,ST *s,Q *q)                    //------ 进车登记 ------//
{
    int ret;
    char nam[10],ch;
    time_t t1;
    time_t t2;

    if(l == NULL || s == NULL || q == NULL) // 入参判断
    {
        return FAILURE;
    }

    printf("请输入车牌:");
    scanf("%s",nam);
    printf("\n");

    while(1)
    {
        if(Getfull(s) != TRUE)
        {
            ret = push(s,nam);
            if(ret == SUCCESS)
            {
				time(&t1);
                if(listInsert(l,nam,t1,t2) != SUCCESS)
                {
                    printf("登记失败\n");
                }   
            }
        }
        else
        {
            printf("停车场已满,此车在等待队列等候\n");
            Enterqueue(q,nam);
        }
        while(1)
        {
            getchar();
            printf("是否继续进车登记'y/n': ");
            scanf(" %c",&ch);
            printf("\n");
            if('y' == ch)
            {
                printf("请输入车牌:");
                scanf("%s",nam);
                break;
            }
            else if('n' == ch)
            {
                break;
            }
            else 
            {
                printf("输入错误,请输入 'y' 或 'n'\n");
            }
        }
        if(ch == 'n')
        {
            break;
        }
    }
    return SUCCESS;
}

int car_out(L *l,ST *s1,ST *s2,Q *q)           // --------出车登记 -----//
{
    char nam[10],*e,*t,ch;  // e 记出栈车牌,ch 记出队车牌
    int ret,k = 0;
	L *p = l,*h = l;
    if(NULL == l || NULL == s1 || NULL == s2 || NULL == q)  // 入参判断
    {
        return FAILURE;
    }
    if(stackEmpty(s1) != FALSE) // 车场为空,不能出车
    {
        printf("车场为空,无车可出!\n");
        return FAILURE;
    }
    printf("请输入要离开车的车牌:");
    scanf("%s",nam);
    printf("\n");
	ret = out(l,s1,s2,nam);
	if(FAILURE == ret)
	{ 
		return FAILURE;
	}
	ret = out1(s1,s2);
	if(FAILURE == ret)
	{ 
		return FAILURE;
	}
	ret = out2(l,s1,q);
	if(FAILURE == ret)
	{
		return FAILURE;
	}
    return SUCCESS;        
}
int find_car(L *l)                // 查询某一辆车辆信息
{
	char nam[10];
	time_t t;
	struct tm *time1;
    struct tm *time2;
	int cost;
	L *p = l->next;
	
	if(NULL == l)
	{
		return FAILURE;
	}
	printf("请输入要查询的车牌:");
	scanf("%s",nam);
	printf("\n");	
	while(p)
	{
		if(strcmp(p->plate,nam) == 0)
		{
			if(strcmp(p->sit,"在场内") == 0)
			{
				time(&t);
				time1 = localtime(&p->T1);
				cost = difftime(t,p->T1);
				printf("查询信息如下:\n");
				printf("车牌号  是否在场内 入场时间(h.m.s)  停留时间(s)\n");
				printf("%s  %s  ",p->plate,p->sit);
				printf("%d.%d.%d  ",time1->tm_hour,time1->tm_min,time1->tm_sec);
				printf("%d\n",cost);
			}
			else
			{
				time1 = localtime(&p->T1);
				cost = difftime(p->T2,p->T1);
				printf("查询信息如下:\n");
				printf("车牌号  是否在场内 入场时间  出场时间  停留时间(s)\n");
				printf("%s  %s  ",p->plate,p->sit);
				printf("%d.%d.%d  ",time1->tm_hour,time1->tm_min,time1->tm_sec);  // 入时
				time2 = localtime(&p->T2);				
				printf("%d.%d.%d  ",time2->tm_hour,time2->tm_min,time2->tm_sec);  // 出时
				printf("%d\n",cost);
			}
			break;
		}
		p = p->next;
	}
	if(p == NULL)
	{
		printf("%s 没有来过此车场\n",nam);
	}
	return SUCCESS;
}

int all_car(L *l)                 // 查询出入记录
{
	L *p,*r;
	time_t t;
	int cost;
	struct tm *time1;
    struct tm *time2;
	p = r = l->next;
	if(NULL == l)
	{
		return FAILURE;
	}
	if(p == NULL)
	{
		printf("没有车辆出入信息");
		return SUCCESS;
	}
	printf("在场内车辆信息如下:\n");
	printf("车牌号  入场时间(h.m.s)  停留时间(s)\n");
	while(p)
	{
		if(strcmp(p->sit,"在场内") == 0)
		{
			time(&t);
			time1 = localtime(&p->T1);
			cost = difftime(t,p->T1);
			printf("%s    ",p->plate);
			printf("%d.%d.%d  ",time1->tm_hour,time1->tm_min,time1->tm_sec);
			printf("%d\n",cost);
		}
		p = p->next;
	}
	printf("已经离开车辆信息如下:\n");
	printf("车牌号  入场时间  出场时间  停留时间(s)\n");
	while(r)
	{
		if(strcmp(r->sit,"已离开") == 0)
		{		
			time1 = localtime(&r->T1);
			cost = difftime(r->T2,r->T1);
			printf("%s    ",r->plate);
			printf("%d.%d.%d    ",time1->tm_hour,time1->tm_min,time1->tm_sec);  // 入时
			time2 = localtime(&r->T2);
			printf("%d.%d.%d  ",time2->tm_hour,time2->tm_min,time2->tm_sec);  // 出时
			printf("%d\n",cost);
		}
		r = r->next;
	}
	return SUCCESS;
}
	
int car_park(L *l)                // 查询场内车辆信息
{
	int cost;
	struct tm *time1;
	time_t t;
	L *p = l->next;
	if(NULL == l)
	{
		return FAILURE;
	}
	printf("停车场内所有车辆信息如下:\n");
	printf("车牌号  入 场 时 间  停留时间(s)\n");
	while(p)
	{
		time(&t);
		cost = difftime(t,p->T1);
		time1 = localtime(&p->T1);		
		if(strcmp(p->sit,"在场内") == 0)
		{
			printf(" %s     %d.%d.%d       %d\n",p->plate,time1->tm_hour,time1->tm_min,time1->tm_sec,cost);
		}
		p = p->next;
	}
	return SUCCESS;
}

int car_wait(Q *q)               // 查询等候车辆信息
{
	if(NULL == q)
	{
		return FAILURE;
	}
	node *p = q->front->next;
	printf("等待的车辆车牌号有:\n");
	while(p)
	{
		printf("%s\n",p->plate);
		p = p->next;
	}
	return SUCCESS; 
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值