栈与队列实现的停车场系统

停车场项目需求


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


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

          (8)退出系统。


头文件:

/*****************************************************
    > File name: CarPark.h
    > Author: Mr.YUAN
    > 日期: 2017-11-27 19:13
*****************************************************/

#ifndef _CARPRAK_H_
#define _CARPARK_H_
#define MAXMUM 3
#define success 1003
#define failure 1000
#define Stack_Full 1001
#define PUSH_OK 1002

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

typedef struct CAR
{
    char num[10];
    time_t intime;
    time_t outtime;
    double expense;
    int length;
    int place;
}car;

typedef struct SeqStack
{
    car park[MAXMUM];
    int top;
}stack;

typedef struct node
{
    car data;
    struct node *next;
}Node;

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

int StackInit(stack *S);
int QueueInit(car_queue *Q);
int menu();
int Push1_Stack(stack *S,car *Car,car_queue *Q);
int in_queue(car_queue *p ,car *Car);
int Push_Stack1(stack *S,car *Car);
car *PopStack1(stack *S,car *Car);
int PopStack(stack *S,car *Car,car_queue *Q);
int Push_Stack(stack *S,car *Car,car_queue *Q);
int display_stack(stack *S);
int display_queue(car_queue *Q);



#endif

//接口函数
/*****************************************************
    > File name: CarPark.c
    > Author: Mr.YUAN
    > 日期: 2017-11-27 19:14
*****************************************************/


#include <stdio.h>
#include"CarPark.h"


int StackInit(stack *S)
{
    S->top = -1;
}


int QueueInit(car_queue *Q)
{
    Q->front = (Node*)malloc(sizeof(Node));
    Q->rear = Q->front;
    Q->front->next = NULL;
    if(NULL == Q->front)
        return failure;
}


int menu()
{
    int choice = 0;
    int ret = 0;


    printf("                     ===============================================\n");
    printf("                    |                                               |\n");
    printf("                    |          欢迎来到停车场管理系统               |\n");
    printf("                    |                                               |\n");
    printf("                     ===============================================\n");
    printf("                    | 1.停车                      2.取车            |\n");
    printf("                    | 3.查看停车场信息            4.查看等待区信息  |\n");
    printf("                    | 5.退出系统                                    |\n");
    printf("                    |===============================================\n");
    printf("                    | 收费标准:停车场按照10元/小时收费,未满1小    |\n");
    printf("                    | 时按1小时计算,等待区不收费!                 |\n");
    printf("                    |                                               |\n");
    printf("                    |===============================================|\n");
    printf("                    | 请输入你选择的功能.........                   |\n");
    printf("                    |-----------------------------------------------|\n");
    ret = scanf("%d",&choice);
    while(ret != 1 || (choice != 1 && choice != 2 && choice != 3 && choice != 4 && choice != 5
            && choice != 6))
            {
                printf("输入有误,请重新输入!\n");
                ret = scanf("%d",&choice);
            }
    if(choice == 1 || choice == 2 || choice == 3 || choice == 4 || choice == 5 || choice == 6)
        return choice;
}


int Push_Stack(stack *S,car *Car,car_queue *Q)
{   
    car_queue *p = Q;
    int   relay ;
    int ret;
    if(S->top == MAXMUM-1)
    {
         printf("停车场已满,是否进入等待区 ?(1/0)\n");
             scanf("%d",&relay);
         if(relay != 1 && relay != 0)
            printf("输入无效,请重新输入!\n");
         if(relay == 1)
         {
            ret = in_queue(p,Car);
            if(ret == success)
                printf("您的车已成功进入等待区!\n");
         }
         if(relay == 0)
            printf("您已放弃停车,请返回主界面退出系统,感谢您的使用!\n");
    }
    else
    {
        S->top++;
        S->park[S->top] = *Car;
        S->park[S->top].place = S->top + 1;
        time(&S->park[S->top].intime);
        return PUSH_OK;
    }
}


int in_queue(car_queue *Q,car *Car)
{
    Node *p = (Node *)malloc(sizeof(Node));
     if(p == NULL)
         printf("malloc p failure!\n");
     p->data = *Car;
     p->next = NULL;
     if(Q->rear == NULL)
     {
         Q->rear = p;
         Q->front->next = p;
     }
     else
     {
         Q->rear->next = p;
         Q->rear = p;
     }
     return success;
}


int Push_Stack1(stack *S,car *Car)
{
    S->top++;
    S->park[S->top] = *Car;


}


car *PopStack1(stack *S,car *Car)
{
    if(S->top != -1)
    {
        *Car = S->park[S->top];
        S->top--;
        return Car;
    }


}


int Push1_Stack(stack *S,car*Car,car_queue *Q)
{
    if(S->top != MAXMUM - 1)
        {
            S->top++;
            S->park[S->top] = *Car;
            S->park[S->top].place = S->top + 1;
            return success;
        }
}
int PopStack(stack *S,car *Car,car_queue *Q)
{
    char num[10];
    int i = 0;
    int flag = 0;
    int j = 0;
    int temp = 0;
    if(S->top == -1)
        printf("取车失败!\n");
    printf("请输入取的车牌号....\n");
    scanf("%s",num);
    while(i <= S->top)
    {
        temp = S->top;
        if((strcmp(num ,S->park[i].num) == 0) && S->park[i].place == i+1)
        { 
            if(i == S->top)
            {
                time(&(S->park[S->top].outtime));
                S->park[S->top].length = S->park[S->top].outtime - S->park[S->top].intime;
                S->park[S->top].expense = ((int)((S->park[S->top].length)/3600 + 1)*10);
                *Car = S->park[S->top];
                S->top--;
            }
            else
            {
                stack *q = (stack *)malloc(sizeof(stack));
                if(failure == StackInit(q))
                    printf("init stack failure!\n");
                j = i;


                while(j < temp)
                {
                    car *Car1 = (car *)malloc(sizeof(car));
                    *Car1 = S->park[S->top];
                    S->top--;
                    Push_Stack1(q,Car1);
                    j++;
                }
                time(&(S->park[S->top].outtime));
                S->park[S->top].length = S->park[S->top].outtime - S->park[S->top].intime;
                S->park[S->top].expense = ((int)((S->park[S->top].length)/3600 + 1)*10);
                *Car = S->park[S->top];
                S->top--;
                j = S->top;
                while(j < temp - 1)
                {
                    car *Car2 = (car*)malloc(sizeof(car));
                    car *newcar = (car*)malloc(sizeof(car));
                    newcar = PopStack1(q,Car2);
                    Push1_Stack(S,newcar,Q);
                    j++;
                }
            }
            flag = 1;
        }
        i++;
    }
    if(flag == 1)
    {
        printf("车已离开停车场,欢迎使用。\n");
        return success;
    }
    else
        printf("没有找到您的车,请确认车牌信息!\n");
}


int printf_check(car *Car)
{
    printf("\n");
    printf("车牌号:%s\n",Car->num);
    printf("停车时间:%s",ctime(&Car->intime));
    printf("取车时间:%s",ctime(&Car->outtime));
    printf("停车时长:%d分钟\n",(int)(Car->length/60+1));
    printf("停车费用:%.1f元\n",Car->expense);
}


int OutQueue(stack *S,car *Car,car_queue *Q)
{
    Node *a = Q->front->next;
    if(Q->front == Q->rear)
        return failure;
        
    if(S->top <= MAXMUM-1)
    {
        *Car = a->data;
        Q->front->next = a->next;
        if(Q->front->next == NULL)
            Q->rear = NULL;
        free(a);
        a = NULL;
        Push_Stack(S,Car,Q);
    }
    return success;
}


int display_stack(stack *S)
{
    int i = 0;
    time_t time_current;
    int length;
    time(&time_current);
    length = time_current - S->park[i].intime;


    if(S->top == -1)
    {
        printf("停车场没有车,无法查看车辆信息..\n");
        return -1;
    }
    while(i <= S->top)
    {
         printf("车牌号:%s\n",S->park[i].num);
         printf("停车时间:%s",ctime(&S->park[i].intime));
         printf("停车状态:使用中.....\n");
         printf("停车位:%d号车位\n",S->park[i].place);
         printf("当前使用时间:%d分钟\n",(int)(length/60)+1);
         printf("停车费用:0元\n",(int)((length/3600)+1)*10);
         printf("\n\n===============================================\n\n");
         i++;
    }
}


int display_queue(car_queue *Q)
{
    Node*p = Q->front->next;
    int i;


    if(p == NULL)
    {
        printf("目前没有车在等候区!\n");
        return 0;
    }
    while(p != NULL)
    {
        printf("车牌:%s\n",p->data.num);
        printf("等待排号:%d\n",++i);
        printf("\n=======

主函数



/*****************************************************
    > File name: Test_CarPark.c
    > Author: Mr.YUAN
    > 日期: 2017-11-27 19:14
*****************************************************/

#include <stdio.h>
#include "CarPark.h"
#include<time.h>
int main()
{
    stack *p,*q;
    car_queue *s;
    int ret;
    int choice;
    int a,i = 0;

   p = (stack*)malloc(sizeof(stack));
   q = (stack*)malloc(sizeof(stack));
   s = (car_queue*)malloc(sizeof(car_queue));
   ret = StackInit(p);
   if(failure == ret)
       printf("init stack1 failure!\n");
   ret = StackInit(q);
   if(failure == ret)
       printf("init stack2 failure!\n");
   ret = QueueInit(s);
   if(failure == ret)
       printf("init queue failure!\n");

    while(1)
    {
        system("clear");
        choice = menu();
        switch(choice)
        {
         case 1:
             {
                 system("clear");
                 car * Car = (car*)malloc(sizeof(car));
                 if(NULL == Car)
                     printf("malloc car failure!\n");
                 printf("请输入车辆相关信息.....\n");
                 scanf("%s",Car->num);
                 while(i <= p->top)
                 {
                     if(strcmp(Car->num,p->park[i].num) == 0)
                     {
                         printf("车牌号重复,请重新输入!\n");
                         scanf("%s",Car->num);
                     }
                     i++;
                 }
                ret = Push_Stack(p,Car,s);
                if(ret == PUSH_OK)
                {
                    printf("停车成功!停车号:%d,停车时间;%s",p->park[p->top].place,
                            ctime(&p->park[p->top].intime));
                }
                break;
             }
         case 2:
            {
                system("clear");
                car *Car1 = (car *)malloc(sizeof(car));
                if(NULL == Car1)
                    printf("malloc failure!\n");
                ret = PopStack(p,Car1,s);
                if(success == ret)
                {
                    printf("停车信息.....\n");
                    printf_check(Car1);
                    car *Car2 = (car *)malloc(sizeof(car));
                    if(NULL == Car2)
                        printf("malloc failure!\n");
                    ret = OutQueue(p,Car2,s);
                        if(s->front == s->rear)
                    if(ret == success)
                        printf("等待区1号车已进入!\n");
                }
                    break;
            }
         case 3:
            {
                system("clear");
                display_stack(p);
                break;
            }
         case 4:
            {
                system("clear");
                display_queue(s);
                break;
            }
         case 5:
            {
                system("clear");
                printf("谢谢使用!\n");
                exit(0);

            }
        }
        printf("\n\n按回车建返回主菜单........");
        getchar();
        getchar();
    }

    return 0;
}





  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
问题描述:利用堆队列实现一个停车场管理系统 基本要求: 设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆次序。编制一程序模拟该停车场的管理。车辆的信息包括:车牌号、汽车到达/离去标志、到达/离去时刻等。按照从终端读入的数据序列进行模拟管理。每辆车需要三个数据,其中车辆数据为:A表示到达,D表示离去,E表示程序结束。车辆牌照为整型数据。进场或离场时间同样为整型数据。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。 停车场管理系统主要实现以下几个功能: (1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。 (2)该程序设计能够通过车牌号能查到该车辆在停车场或便道中的位置。 (3)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。实现停车场的调度功能。 [测试数据] (A,1,1) (A,2,2) (A,3,3) (A,4,4) (A,5,5) (D,2,7) (A,1,8) (A,4,9)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值