2.停车场管理

Ø 算法设计思想

停车场用栈模拟,栈以顺序结构实现;停车场外的便道用队列模拟,而队列用链式结构实现。需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含六个数据项:汽车的牌照号码,入场的时刻,出场的时刻,入场为值,便道位置及所需费用。其中时间也是个结构体,有小时和分钟两个数据项。结构如下:

struct Time{ int hour; //int min; // };       

struct Car{

      int inplac;e//入场位置   int outplace;//便道位置

      char num[20]; //车牌号   struct Time in; //入场时间

      struct Time out;//出场时间   double price; //所需费用

};

Ø  算法设计分析

1.      void Arrive(SqStack &S,LinkQueue &Q,ElemType e)//汽车到达,需要先判断停车场是否已停满,如果还有空位就进栈,同时记录入场时间,否则就停在车场外的便道上,即入队。标记在停车场中的位置或在便道上的位置。算法如下:

if(S.top-S.base>=S.stacksize) //判满

         { 

                 cout<<"车场内已停满车!"<<endl;

               cout<<"在便道上的停车位置:";

               e.outplace=++OutPlace;  cout<<e.outplace<<endl;

               EnQueue(Q,e);//进队

      }

      else //停车场有位置

      { 

               cout<<"输入到达时间:";

               cin>>e.in.hour>>c>>e.in.min;

               Push(S,e);   e.inplace=++InPlace;

               cout<<"在停车场中的位置:";     cout<<e.inplace<<endl;

          }

2.      void Leave(SqStack &S,SqStack &s,LinkQueue &Q,char num[20])//汽车离开停车场,根据车牌号找需要离开的汽车,让栈顶元素依次出栈,知道找到为止,另外让出来的车进入临时栈s中,算法如下:

            e=Pop(S);

     while(strcmp(e.num,num)!=0)//从栈顶按车牌号找要离开的车

    {

           Push(s,e); //把出来的车进个临时栈里

           e=Pop(S);

          }

输入离开时间,计算该车的停留时间及应缴纳的费用。然后让退出车场的车再按原次序进入车场,并改变在停车场中的位置,即都进1,算法如下:

     while(s.base!=s.top)//把退出车场的车再按原次序进入车场

    { 

          e1=Pop(s);

          e1.inplace--; //在停车场的位置进1

          Push(S,e1); 

          }

如果便道上有车,即队不空,让第一辆车开入(进栈),此时标记该车进入车场的时间等于上辆车的离开时间,主要算法如下:

if(Q.rear!=Q.front) //如果便道有车,第一辆车开入

       {  

                e2=DeQueue(Q);   Push(S,e2);//进入停车场

e2.in.hour=e.out.hour;//进入车场时间等于上辆车的离开时间

                e2.in.min=e.out.min;

 e2.inplace=++InPlace; //在停车场的位置加1

}

如果便道有车,则依次前进,即在便道上的停车位置减1,程序如下:

      QNode *p=Q.front->next;

 if(Q.front!=Q.rear)//如果便道有车,则依次前进

       { 

           while(p)

          {

              p->data.outplace--;//在便道的停车位置减1

              p=p->next;

           }

            OutPlace--; //便道位置的总长减1

       }

源代码:

#include<iostream.h>

#include<string.h>

#include<stdlib.h>

#define OVERFLOW -2

#define Max 3 //停车场容量

#define Price 0.01//按分钟收费

struct Time{

         int hour; //

         int min; //

};

struct Car{

         int inplace;//入场位置

         int outplace;//便道位置

         char num[20]; //车牌号

         struct Time in; //入场时间

         struct Time out;//出场时间

         double price; //所需费用

};

typedef Car ElemType;

//栈的顺序存储表示

typedef struct{

         ElemType *base; //在栈构造之前和销毁之后,base的值为NULL

         ElemType *top; //栈顶指针

         int stacksize; //当前已分配的存储空间,以元素为单位

}SqStack;

//队列的链式存储结构

typedef struct QNode{

         ElemType data;

         struct QNode *next;

}QNode,*QueuePtr;

typedef struct{

         QueuePtr front; //队头指针

         QueuePtr rear; //队尾指针

}LinkQueue;

char c;

int InPlace=0,OutPlace=0;//标记停车位置,初始化为0

//栈的基本操作

void InitStack(SqStack &S)//构造空栈S

{

         S.base=new ElemType[Max];

         if(!S.base) exit(OVERFLOW);//存储分配失败

         S.top=S.base;

         S.stacksize=Max;

}

 void Push(SqStack &S,ElemType e)//进栈

{

         if(S.top-S.base>=S.stacksize)

         {

                   if(!S.base) exit(OVERFLOW) ;

                   S.top=S.base+S.stacksize;

         }

         *S.top++=e;

}

ElemType Pop(SqStack &S) //出栈

{

         ElemType e;

         if(S.top==S.base) cout<<"栈空"<<endl ;

        e=*--S.top;

         return e;

}

//队列的基本操作

void InitQueue(LinkQueue &Q) //构造空队列Q

{

         Q.front=Q.rear=new QNode;

         if(!Q.front) exit(OVERFLOW); //存储分配失败

         Q.front->next=NULL;

}

void EnQueue(LinkQueue &Q,ElemType e)//入队

{

         QNode *p;

         p=new QNode;

         if(!p) return ;

         p->data=e;

         p->next=NULL;

         Q.rear->next=p;

         Q.rear=p;

}

ElemType DeQueue(LinkQueue &Q)//出队

{

         ElemType e;

         QNode *p;

         if(Q.front==Q.rear) cout<<"队空"<<endl;

         p=Q.front->next;

         e=p->data;

         Q.front->next=p->next;

         if(Q.rear==p) Q.rear=Q.front;

         delete p;

         return e;

}

void Arrive(SqStack &S,LinkQueue &Q,ElemType e)//车辆到达

{ //S为停车场,队列Q为便道

    if(S.top-S.base>=S.stacksize)

         {

                   cout<<"车场内已停满车!"<<endl;

                   cout<<"在便道上的停车位置:";

                   e.outplace=++OutPlace;

                   cout<<e.outplace<<endl;

                   EnQueue(Q,e);

         }

         else

         { 

                   cout<<"输入到达时间:";

                   cin>>e.in.hour>>c>>e.in.min;

                   Push(S,e);

                   e.inplace=++InPlace;

                   cout<<"在停车场中的位置:";

                   cout<<e.inplace<<endl;

          }

}

void Leave(SqStack &S,SqStack &s,LinkQueue &Q,char num[20])//车辆离开

{

     int time;

     ElemType e,e1,e2;

     e=Pop(S);

     while(strcmp(e.num,num)!=0)//从栈顶按车牌号找要离开的车

          {

                    Push(s,e); //把出来的车进个临时栈里

                    e=Pop(S);

          }

          InPlace--; //车离开,多个空位

          cout<<"请输入离开时间:";

          cin>>e.out.hour>>c>>e.out.min;

          time=e.out.hour*60+e.out.min-(e.in.hour*60+e.in.min);

          cout<<"停留的时间(分钟):";

          cout<<time;

          e.price=Price*time;

          cout<<"**********应交纳的费用(元):";

          cout<<e.price<<endl;

          while(s.base!=s.top)//把退出车场的车再按原次序进入车场

          { 

                   e1=Pop(s);

                   e1.inplace--; //在停车场的位置进1

                   Push(S,e1); 

          }

          if(Q.rear!=Q.front) //如果便道有车,第一辆车开入

          {

                    e2=DeQueue(Q);

                    e2.in.hour=e.out.hour;//进入车场时间等于上辆车的离开时间

                    e2.in.min=e.out.min;

                    cout<<"车牌号为"<<e2.num<<"到达时间:";

                    cout<<e2.in.hour<<":"<<e2.in.min;

                    cout<<"----------在停车场中的位置:";

                    e2.inplace=++InPlace; //在停车场的位置加1

                    cout<<e2.inplace<<endl;

                    Push(S,e2); //(***变量名不能标错***)

          }

         QNode *p=Q.front->next;

          if(Q.front!=Q.rear)//如果便道有车,则依次先前进

          {

                    while(p)

                    {

                          p->data.outplace--;//在便道的停车位置减1

                          p=p->next;

                    }

                    OutPlace--; //便道位置的总长减1(***易错点***)

          }

}

int main()

{

         Car car;

         SqStack S,s;//S为停车场,s为临时栈

         LinkQueue Q;//队列Q为便道

         char ch,str[20];

         InitStack(S);//初始化

         InitStack(s);

         InitQueue(Q);

         cout<<"*****************欢迎进入停车管理系统******************"<<endl;

         cout<<"-------------操作如下:"<<endl;

         cout<<"-------------A.到达"<<endl;

         cout<<"-------------L.离去"<<endl;

         cout<<"-------------E.退出"<<endl;

         while(1)

         {

              cout<<"请选择操作:";

              cin>>ch;

             switch(ch)

                   {

            case 'A': cout<<"请输入到达汽车的车牌号:";

                         cin>>car.num;

                         Arrive(S,Q,car);  break;

             case 'L': cout<<"请输入要离开汽车的车牌号:";

                         cin>>str;

                         Leave(S,s,Q,str);  break;

             case 'E': exit(0);

                   }

                   cout<<endl;

         }

         return 0;

}

 

posted @ 2011-06-29 16:32  笑巧  阅读(594)  评论(0编辑  收藏  举报