停車場的模擬管理(資料結構 C++)

隨便叫個啥呢發表於2015-02-02

[問題描述]:
          設有一個可以停放n輛汽車的狹長停車場,它只有一個大門可以供車輛進出。車輛到達停車場時間的早晚依次從停車場最裡面向大門口處停放(最先到達的第一輛車放在停車場最裡面)。如果停車場已放滿n輛車,則後來的車輛只能停在停車場大門外的便道上等待,一旦停車場裡有車開走,則排在便道上的第一輛車就進入停車場。若停車場內有某輛車要開走,在它之後進入停車場的車都必須先退出停車場,為它讓路,待其開出停車場後,這些車再依原來的次序進場。每輛車離開停車場

  時,都應根據其在停車場的逗留時間交費。如果停留在便道上的車未進停車場就要離去,允許其離去,不收停車費,並且仍然保持在便道上等待的車輛順序。編制一程式模擬停車場的管理。

【實現要求】

 1、要求程式輸出每輛車到達後的停車位置(停車場)或便道上;

 2、某輛車離開停車場時應交納的費用和停留時間;

程式設計

#include "stdio.h"
#include "stdlib.h"
#define A 5                /* 停車單價 */
#define TRUE 1
#define FALSE 0
#define NULL 0
#define Stack_Size 2  /* 車庫容量 */
typedef struct
{
    int elem1[Stack_Size];
    int elem2[Stack_Size];
    int elem3[Stack_Size];
    int elem4[Stack_Size];
    int top;
}SeqStack;                /* 定義棧的結構體 */
typedef struct Node
{
    int date;
    int num;
    int hour;
    int minute;
    struct Node *next;
}LinkQueueNode;            /* 定義鏈佇列結點的結構體 */
typedef struct
{
    LinkQueueNode *front;
    LinkQueueNode *rear;
}LinkQueue;                /* 定義鏈佇列的結構體*/
InitQueue(LinkQueue *Q) /* 初始化鏈佇列函式 */
{
    Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
    if(Q->front!=NULL)
    {
        Q->rear=Q->front;
        Q->front->next=NULL;
        return(TRUE);
    }
    else return(FALSE);
}
EnterQueue(LinkQueue *Q,int x,int y,int z,int w) /* 入鏈佇列函式 */
{
    LinkQueueNode *NewNode;
    NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
    if(NewNode!=NULL)
    {
        NewNode->num=x;
        NewNode->date=y;
        NewNode->hour=z;
        NewNode->minute=w;
        NewNode->next=NULL;
        Q->rear->next=NewNode;
        Q->rear=NewNode;
        return(TRUE);
    }
    else return(FALSE);
}
DeleteQueue(LinkQueue *Q,int *x,int *y,int *z,int *w) /* 刪除鏈佇列結點函式 */
{
    LinkQueueNode *p;
    if(Q->front==Q->rear)
    {
        return(FALSE);
    }
    p=Q->front->next;
    Q->front->next=p->next;
    if(Q->rear==p)
    {
        Q->rear=Q->front;
    }
    *x=p->num;
    *y=p->date;
    *z=p->hour;
    *w=p->minute;
    free(p);
    return(TRUE);
}
void InitStack(SeqStack *S)            /* 初始化棧 */
{
    S->top=-1;
}
int Push(SeqStack *S,int x,int y,int z,int w)    /* 棧插入函式 */
{
 
    S->elem1[S->top]=x;
    S->elem2[S->top]=y;
    S->elem3[S->top]=z;
    S->elem4[S->top]=w;
    S->top++;
    return(TRUE);
}
int Pop(SeqStack *S,int *x,int *y,int *z,int *w)    /* 棧刪除函式 */
{
    if(S->top==-1)
    {
        return(FALSE);
    }
    else {
          S->top--;
          *x=S->elem1[S->top];
          *y=S->elem2[S->top];
       *z=S->elem3[S->top];
       *w=S->elem4[S->top];
       
        return(TRUE);
    }
}
int IsFull(SeqStack *S) /* 判斷棧滿函式 */
{
    return(S->top==Stack_Size-1?TRUE:FALSE);
}
int IsEmpty(SeqStack *S) /* 判斷棧滿函式 */
{
    return(S->top==-1?TRUE:FALSE);
}
int choose() /* 選擇函式 */
{
    int m;
    printf(" 請選擇:1. 停車; 2. 停車場出車; 3. 便道出車;4.退出  ");
    scanf("%d",&m);
    if(m==1||m==2||m==3)
    {
        return(m);
    }
    if(m==4)
    {
        exit(0); /* 整個程式由此結束 */
    }
    else
    {
        printf("選擇錯誤!");
        exit(1);
    }
}
void main()
{
    int m,num,pp=1,k=0,p=0,x,y,z,w,t ,date,hour,minute;
    LinkQueue *Q=(LinkQueue*)malloc(sizeof(LinkQueue));
    SeqStack *S=(SeqStack*)malloc(sizeof(SeqStack)),*R=(SeqStack*)malloc(sizeof(SeqStack));
    InitQueue(Q);
    InitStack(R);
    InitStack(S);  
    while(pp!=0)                        /* 控制程式一直迴圈 */
    {
        m=choose();                        /* 整個程式由此進 */
        printf("請輸入汽車號碼: ");
        scanf("%d",&num);
        printf("請輸入時間:例:20,7:35表示某月20日7:35停車或出車 ");
        scanf("%d,%d:%d",&date,&hour,&minute);
        if(m==1)
        {
            printf("No.%d 號汽車停在 ",num);
            if(IsFull(S))                        /* 先判斷車庫是否滿了 */
            {
                EnterQueue(Q,num,date,hour,minute);            /* 如果滿了,則放入便道里(鏈佇列) */
                k++;                            /* 便道里的位置計數器 */
                printf("便道中的第 %d 號位置. ",k);
            }
            else
            {
                Push(S,num,date,hour,minute);                /* 如果不滿,則放入車庫裡(順序棧) */
                p++;                            /* 車庫裡的位置計數器 */
                printf("停車場的第 %d 號位置! ",p);
            }
        }
        if(m==2)
        {
            if(IsEmpty(S))                        /* 判斷車庫還有車嗎,其作用為防止非法輸入 */
            {
                printf("車庫為空,No.%d 不在!",num);
                exit(2);
            }
            while(num!=S->elem1[S->top]) /* 尋找所要出的車 */
            {
                Pop(S,&x,&y,&z,&w);            /* 車庫最外輛車出庫 */
                while(p>0)
                {
                    p--;                /* 出車則減一個數 */
                }
                Push(R,x,y,z,w);            /* 將剛出的車入臨時車庫(順序棧) */
            }
            Pop(S,&x,&y,&z,&w);                /* 找到車後將其彈出 */
            p--;                        /* 出車則減一個數 */
            t=(date-y)*1440+(hour-z)*60+minute-w;                    /* 計算其停車時間 */
            printf("No.%d 的車在車庫停了 %d 分鐘.$:%d ",num,t,t*A);
            while(!IsEmpty(R))
            {
                Pop(R,&x,&y,&z,&w);
                Push(S,x,y,z,w);
                p++;
            }                            /* 將臨時車庫的車全部轉到車庫 */
            if(Q->front!=Q->rear)        /* 判斷便道是否有車 */
            { DeleteQueue(Q,&x,&y,&z,&w);        /* 如果有則出便道 */
                Push(S,x,y,z,w);            /* 進車庫 */
                p++;                    /* 車庫計數器加1 */
                k--;                    /* 便道計數器減1 */
            }
        }
        if(m==3)
        {
          
             DeleteQueue(Q,&x,&y,&z,&w);
              k--;
              t=(date-y)*1440+(hour-z)*60+minute-w;
              printf("No.%d 的車在便道停了 %d 分鐘.",num,t);
            
        }
    }   
}


相關文章