您的位置:首页 > 其它

停车场管理 -- 队列 栈 实现

2012-07-21 15:03 316 查看
实现功能 :

   1. 查看停车场全部车子情况;

   2. 查看某辆车的费用情况;

   3. 停车;

   4. 离开(如果车场满并且等待区有车子在等待,这时如果有车子离开会提醒等待区排在第一位的车子进入停车场);

   5. 查看等待区的车子 ;

   6. 离开等待序列

   7. 停车场满时可排队等待 ;   

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

#define LIM 10           //定义停车场可停车的限制数量
#define M 1             //一秒钟一元

int sq = 0 ;                  //停车序号,当车场满时为等待序号

typedef struct node_p    //停车队列 顺序
{   
    int car_num[LIM];
    int ptime[LIM];
    int front,rear;
}PARK;

typedef struct node
{
    int n;
    int t;
}NODE;

typedef struct give      //让路 顺序栈
{
    int time[LIM];
    int num[LIM];
    int top;
}WAY;

typedef struct node_w    //等待队列 链式
{
    int wn;
    struct node_w *next;
}NODE_W;
typedef struct queue
{
    NODE_W *front,*rear;
}WAIT;

PARK *park;
WAY *way;
WAIT *wait;

void init_park()            //初始化停车队列
{
    park = (PARK *)malloc(sizeof(PARK));
    park->rear = 0;
    park->front = 0;
    park->car_num[park->front] = 0;
}

void init_way()            //初始化让路栈

    way = (WAY *)malloc(sizeof(WAY));
    way->top = -1;
}

void init_wait()           //初始化等待队列
{
    wait = (WAIT *)malloc(sizeof(WAIT));
    wait->front = (NODE_W *)malloc(sizeof(NODE_W));
    wait->front->wn = 0;
    wait->front->next = NULL;
    wait->rear = wait->front;
}

void en_way(WAY *W,int tm,int n)                   //进入让路栈,n:让路车的序号,tm: 让路车的进入停车场时间
{
    W->top ++;
    W->num[W->top] = n;
    W->time[W->top] = tm;
    //printf("push : %d\n",n);
}

NODE *out_way(WAY *W)                           // 出让路栈
{
    NODE *ptr = (NODE *)malloc(sizeof(NODE));
    ptr->t = W->time[W->top];
    ptr->n = W->num[W->top];
    //printf("pop :%d\n",ptr->n);
    W->top --;
    return ptr;
}

void display_way()       // 测试有没有进入让路栈
{
    printf("让路的车:\n");
    int n = 0;
    while(n != way->top + 1)
    {
        printf("序    号:");
        printf("%d\t",way->num
);
printf("\n");
printf("停车时间:");
printf("%d\t",way->time
);
printf("\n");
        n ++;
    }
}
void en_wait(WAIT * W)                 //进入等待队列
{
    if(W->front->wn == 0)
    {
        W->front->wn= sq;
    }
    else
    {
        NODE_W *ptr = (NODE_W *)malloc(sizeof(NODE_W));
ptr->wn = sq;
W->rear->next = ptr;
W->rear = ptr;
    }
}

int out_wait(WAIT *W)          //等待队列第一个出 进如停车场
{
    int n;
    n = W->front->wn;
    W->front = W->front->next;
    return n;
}
void display_wait(WAIT *W)     //显示等待队列中车子的停车序号
{
    NODE_W *ptr = W->front;
    printf("正在等待的车子: ");
    while(ptr != NULL)
    {
        printf("M",ptr->wn);
ptr = ptr->next;
    }
}
void en_park(PARK *P)           //进入停车场 —— 停车

    time_t now;
    now = time(NULL);
    sq = sq + 1;
    if(P->rear+1 == LIM)
    {
        printf("停车场已满,请等待!\n");
        printf("\t (=_=)  您的等待停车序号是%d. (=_=)\n",sq);
en_wait(wait);
        
    }
    else
    {
        if(P->car_num[P->front] == 0)
{
   P->car_num[P->front] = sq;
   P->ptime[P->front] = now;
            printf("\t(^_^) 您的停车序号是%d. (^_^)\n",sq);
}
else
{
   P->rear ++;
   P->car_num[P->rear] = sq;
   P->ptime[P->rear] = now;
            printf("\t(^_^) 您的停车序号是%d. (^_^)\n",sq);
}
    }
    
}

void back_park(PARK *P,int n,int t)   //从让路栈返回停车场
{
    //printf("back : %d\n",n);
    //printf("back front : %d\t",P->front);
    
    if(P->car_num[P->front] == 0)
    {
        P->car_num[P->front] = n;
P->ptime[P->front] = t;
    }
    else
    {   
        if(P->car_num[P->rear] == 0)
        {
            P->car_num[P->rear] = n;
   P->ptime[P->rear] = t;
}
else
{
   P->rear ++;
            P->car_num[P->rear] = n;
   P->ptime[P->rear] = t;
}
    }
    //printf("back rear : %d\t",P->rear);

}

int leave_park(PARK *P,int n,WAY *W)   //车离开停车场
{
    int time;
    if(P->car_num[P->rear] == n)
    {    
        time = P->ptime[P->rear]; 
        P->car_num[P->rear] = 0;
        P->ptime[P->rear] = 0;
P->rear = P->rear - 1;
return time;
    }
    else
    {   
        while(P->car_num[P->rear] != n)
{
            en_way(W,P->ptime[P->rear],P->car_num[P->rear]);
   P->rear --;
   //display_way();
        }
        time = P->ptime[P->rear]; 
        P->car_num[P->rear] = 0;
        P->ptime[P->rear] = 0;
        NODE *ptr = (NODE *)malloc(sizeof(NODE));
        while(W->top != -1)
        {
            ptr = out_way(W);
   //display_way();
            back_park(P,ptr->n,ptr->t);
        }
        return time;
    }
}  

void wait_park(PARK *P)        //当车场已满然后有车离开时提醒等待序列中的第一个进入停车场
{
    if(P->rear+1 != LIM)                 //判断停车场是否已满 如果没有满
    {
        int n = 0;
n = out_wait(wait);
time_t t;
t = time(NULL);
printf("等待车队中停车序号%d的车子可以进入停车场\n",n);
        if(P->car_num[P->front] == 0)
{
            P->car_num[P->front] = n;
   P->ptime[P->front] = t;
}
else
{
   P->rear ++;
   P->car_num[P->rear] = n;
   P->ptime[P->rear] = t;
}
           printf("\t(^_^) 您的停车序号是%d. (^_^)\n",n);
    }
}

void search(PARK *P,int number)  // 查看一辆车的情况

    int i = 0;
    float c = 0;
    int n = 0;
    time_t tm;
    tm = time(NULL);
    printf("%d\n",tm);
    while(P->car_num[i] != number)
    {
i ++;
    }
    printf("%d\n",P->ptime[i]);
    c = (tm - P->ptime[i])*M;
    n = P->car_num[i];
    
    printf("您的停车号: %d \t 目前费用:%5.2f !\n",n,c);
}

void display_park(PARK *P,int n)     //显示停车场目前情况
{
    if(n == LIM - 1)
    {
        printf("停车场已满,请等待!\n");
    }
    else
    {
        if(n < LIM)
        {
            printf("停车场内可停放%d辆车,目前停车场内停放了%d辆车.\n",LIM,n);
}
    }

}

void display_car(PARK *P)  //查看车场内所有车的情况
{
    int n = 0;
    float count = 0;
    if(P->car_num[P->front] == 0)
    {
        printf("车场空,欢迎停车!\n");
    }
    else
    {
        printf("车场内有%d辆车,具体信息如下 :\n",P->rear+1);
        while(n < P->rear + 1)
        {
            time_t tm;
            tm = time(NULL);
            printf("停车序号: ");
            printf("M\t  ",P->car_num
);
   count = (tm - P->ptime
)*M;
   printf("目前费用:");
   printf("%4.1f\t",count);
   printf("\n");
   n ++;
        }
printf("\n");
if(n == LIM )
{
   printf("车场已满,请稍候\n");
   printf("\n");
}
    }
}

void o_wait(int n)        //离开等待序列
{
    NODE_W *ptr = wait->front->next;
    NODE_W *tmp = (NODE_W *)malloc(sizeof(NODE_W));
    if(wait->front->wn == n)
    {
        out_wait(wait);
    }
    else
    {
        while(ptr->wn != n)
        {
            tmp = ptr;
   ptr = ptr->next;
        }

        tmp->next = ptr->next;
        tmp = ptr;
        ptr = ptr->next;
        free(tmp);
   }
}

int main()
{
    printf("************************************************************\n");
    printf("************************************************************\n");
    printf("\t\t欢迎来到来福停车场\n");
    printf("  \t来福车场停车每分钟60元,感谢您选择来福\n");
    printf("************************************************************\n");
    printf("************************************************************\n");
    printf("\n");

    init_park();
    init_way();
    init_wait();
    display_park(park,0);
    printf("\n");
    while(1)
    {   
        int n;
printf("\n");
        printf("****************************************\n");
        printf("\t1 : 查看停车场当前情况\n");
printf("\t2 : 停车\n");
printf("\t3 : 离开\n");
printf("\t4 : 查看车的情况\n");
printf("\t5 : 查看等待队列\n");
printf("\t6 : 离开等待队列\n");
printf("\t7 : 退出\n");
        printf("****************************************\n");
printf("\n");
        printf("请输入你的需要:");
        scanf("%d",&n);
printf("\n");

        switch(n)
{
   case 1:
  display_car(park);
  break;
            
   case 2:
          en_park(park);
          break;
            
   case 3:
         {
     if(park->car_num[park->front] == 0)
     {
         printf("场内没有车\n");
 break;
     }
     
     int n;
     int tm;
     float t;
     time_t lv_t;
     float count;
     printf("请输入你要开走的车辆的序号:");
     scanf("%d",&n);
     
     tm = leave_park(park,n,way);
     lv_t = time(NULL);
     count = (lv_t - tm) * M; 

     printf("您的车在本停车场内停放%d秒,共消费%5.2f元\n",lv_t - tm,count);
             printf("\n");
     if(wait->front->wn != 0)
         {
         wait_park(park);
 if(wait->front == NULL)
 {
      wait ->front = (NODE_W *)malloc(sizeof(NODE));
 }
     }
 
 }
          break;
            
   case 4:
         {   int n;
     printf("请输入你的车的停车序号:");
     scanf("%d",&n);
     search(park,n);
 }
  break;
            
   case 5: display_wait(wait);
          break;
            
   case 6:
                  {
     int n;
     printf("请输入要离开的停车序号:");
                      scanf("%d",&n);
             o_wait(n);
         }break;
   case 7:
          exit(0);
          break;

   default : break;
}
    }

    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct null float search 测试 c