数据结构课设——停车场管理

题目

设停车场(如下图1所示)内只有一个可停放几量汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已经停满几量汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆汽车即可开入;当停车场内某车辆要离开时,由于停车场是狭长的通道,在它之后开入车场的车辆必须先退出车场为它让路,待该车辆开出大门外后,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走。试设计一个停车场管理程序(这里只是一个假想的停车场管理,并不代表实际的停车场管理)。

分析:汽车在停车场内进出是按照栈的运算方式来实现的,先到的先进停车场;停车场的汽 车离开停车场时,汽车场内其它汽车为该辆汽车让路,也是按栈的方式进行;汽车在便道上等候是按队列的方式进行的。因此,将停车场设计成一个栈,汽车让路也需要另一个栈来协助完成,汽车进出便道用队列来实现。

本设计,栈采用顺序栈结构,队列用链式存储结构。
存储结构定义如下:

 #define  stacksize  10
 typedef  struct  sqstack
 {
  int  data[stacksize];
  int  top;
 } SqStackTp;
typedef struct  linked_queue
{
  int  data;
  struct  linked_queue  * next;
}LqueueTp;
typedef  struct 
{
  LqueueTp  *front ,  *rear ;
} QueptrTp;

停车场管理的算法描述如下:
1)接受命令和车号,若是汽车要进停车场,先判断停车场栈是否满,若不满,则汽车入栈,否则汽车进入便道队列等候。
2)若是汽车要离开停车场,为给汽车让路,将停车场栈上若干辆汽车入临时栈,等这辆车出停车场后,临时栈中的汽车出栈,在回到停车场栈,然后看便道队列是否为空,若不空则说明有汽车等候,从队头取出汽车号,让该车进入停车场栈。
3)重复1),2)直到为退出命令(车号为0或负数)。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
typedef struct Queue
{
    int data;
    struct Queue *next;
} Queue,*Que;
int vis[N],top=0; //用栈表示停车场
Que Q; //表示等待序列
int length; //表示停车场容量
int cnt = 0; //表示当前停车场内有多少车辆
int rem = 0; //表示等待区车辆的数量

void enter(int num,Que &Q); //表示停车
void enterqueue(Que &Q,int num); //入队操作
void leave(int num,Que &Q); //表示离开
void leavevis(int num); //表示离开停车场的操作
int popqueue(Que &Q); //表示出队操作
int main()
{
    Q=new Queue; //初始化等待区
    char op;
    int num;
    cout<<"请输入停车场的容量 : ";
    cin>>length;
    cout<<endl;
    while(1)
    {
        cout<<"T-停车,L-离开,其他字符-操作结束"<<endl;
        cout<<"请输入操作和车辆编号 : ";
        cin>>op>>num; //输入操作和车辆编号
        if(op=='T') //停车
            enter(num,Q);
        else if(op=='L') //表示离开
            leave(num,Q);
        else //其他字符表示输入结束
            break;
    }
    cout<<"操作结束"<<endl;
    return 0;
}
int popqueue(Que &Q) //表示出队操作
{
    int k=Q->next->data;
    Que p=Q->next;
    Q->next=p->next;
    free(p);
    rem--;
    return k;
}
void leavevis(int num) //表示离开停车场的操作
{
    int i;
    for(i=1; i<=top; i++) //判断该车辆是否在停车场中
    {
        if(vis[i]==num) break;
    }
    for(int j=i; j<=top; j++) swap(vis[j],vis[j+1]);
    top--;
    cnt--;
    //for(int i=1;i<=top;i++) cout<<vis[i]<<endl;
}
void leave(int num,Que &Q) //表示离开
{
    int f=0;
    for(int i=1; i<=top; i++) //判断该车辆是否在停车场中
    {
        if(vis[i]==num)
            f=1;
    }
    if(f==1) //表示从停车场中离开
    {
        leavevis(num);
        cout<<num<<"号车辆已经从停车场中离开!"<<endl<<endl;
        if(Q->next==NULL) //判断有没有车辆在等待区
            cout<<"当前等待区为空,没有车辆进入停车场"<<endl<<endl;
        else //有车辆在等待区
        {
            int k=popqueue(Q);
            vis[++top] = k;
            cnt++;
            cout<<k<<"号车辆已经进入停车场,当前还有"<<rem<<"辆车在等待区"<<endl<<endl;
        }
    }
    else if(f==0) //表示从等待区中离开
    {
        Que p1=Q,p2=Q->next;
        while(p2->data!=num&&p2->next!=NULL)
        {
            p2=p2->next;
            p1=p1->next;
        }
        if(p2->data!=num) cout<<"当前车辆不存在!"<<endl<<endl;
        else
        {
            p1->next=p2->next;
            free(p2);
            rem--;
            cout<<num<<"号车辆已经从等待区离开,当前还有"<<rem<<"辆车在等待区"<<endl<<endl;
        }
    }
}
void enterqueue(Que &Q,int num) //入队操作
{
    Que p=new Queue;
    p->data=num;
    Que k=Q;
    while(k->next) k=k->next;
    k->next=p;
    p->next=NULL;
    rem++;
}
void enter(int num,Que &Q) //表示停车
{
    if(cnt<length)
    {
        vis[++top]=num;
        cnt++;
        cout<<num<<"号车辆已放入停车场中!当前有"<<cnt<<"辆车在停车场"<<endl<<endl;;
    }
    else
    {
        enterqueue(Q,num);
        cout<<num;
        cout<<"号车辆已经进入等待区,当前共有"<<rem<<"辆等待车辆"<<endl<<endl;;
    }
}

上一篇:2.0版 CodeVS1099 字串变换 题解


下一篇:P2120 [ZJOI2007]仓库建设