课设-停车场管理(栈和队列的应用)

停车场管理(栈和队列的应用)

1.问题描述

[题目描述]

设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。试为停车场编制按上述要求进行管理的模拟程序。

以栈模拟停车场,以队列模拟车场外的便道。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;当车辆将要离去时,若车在停车场内,模拟输出汽车出入情况并输出汽车在停车场内停留的时间,若车在便道上,直接输出汽车在停车场内停留的时间:0。栈以顺序存储结构实现,队列以链表结构实现。

 [输入]

第一行输入一个整数n:代表停车场最多可以停放n辆汽车。(1<=n<=100)

接下来输入一个整数q:代表有q个信息。(1<=q<=200)

每一个信息,输入三个数据项:汽车到达("arrive")或汽车离去(“leave”),汽车的id,以及到达或离去的时间点t。(0<=t<=10000,id只含数字和字母,1<=strlen(id)<=10)

数据保证:到达的汽车不会已经在停车场或便道,离开的汽车一定在停车场或便道,且q个信息的时间点t升序。

 [输出]

对于每一个信息输出一行:

汽车是到达("arrive"):如果在便道上输出字符串"Queue",如果在停车场内输出字符串"Stack",并输出所在的位置,栈底的元素是第一个位置,队首的元素是第一个位置(字符串和位置用空格隔开)。

汽车是离开("leave"):如果在停车场内,以"汽车id"+":"+"in或者out"模拟输出汽车的移动情况,再输出停留在停车场的时间(忽略让路的时间);如果在便道上,直接输出汽车在停车场内停留的时间:0。

 [样例输入]

3

10

arrive A245 0

arrive B478 1

arrive D156 2

arrive C851 5

arrive G156 15

leave C851 20

arrive U11232 30

leave B478 33

leave G156 50

leave U11232 66

 [样例输出]

Stack 1

Stack 2

Stack 3

Queue 1

Queue 2

0

Queue 2

D156:out B478:out D156:in G156:in 32

G156:out U11232:in 17

U11232:out 16

 [提示]

样例栈和队列的情况 栈底为第一个,队首为第一个

    1. 栈:A245     队列:

    2. 栈:A245 ,B478     队列:

    3. 栈:A245 ,B478,D156     队列:

    4. 栈:A245 ,B478,D156     队列:C851 

    5. 栈:A245 ,B478,D156     队列:C851,G156

    6. 栈:A245 ,B478,D156     队列:G156

    7. 栈:A245 ,B478,D156     队列:G156,U11232

    8. 栈:A245 ,D156,G156     队列:U11232

    9. 栈:A245 ,D156,U11232    队列:

    10.栈:A245 ,D156   队列:

2.需求分析

//定义一个汽车结构体

struct CAR{

    int time;//时间

    string name;//车牌号

    CAR(){}

    CAR(int t,string n):time(t),name(n){}

};

//定义一个栈结构体

struct Stackk

{

}s;

//定义一个队列结构体

struct Queuee

{

}q;

3.算法设计

1. init()//创建栈

2. empty()//判断栈空

3. isfull()//判断栈满

4. size()//求栈的长度

5. push(CAR x)//入栈

6. pop()//出栈

7. top()//返回栈顶元素

8. init()//创建队列

9. empty()//判断队列是否为空

10. isfull()//判断队列是否为满

11. size()//求队列长度

12. push(CAR x)//入队列

13. pop()//出队列

14. find(string x)//找车牌号

15. erase(string x)//抹去、删除

4.调试分析

使用结构体存储栈和队列,简化了创建和入栈、出栈的代码,较为简便。本题使用了两个栈和一个队列,一个栈用作停车场,另一个栈用作退车时的临时便道,队列用来当作便道。这样,栈里的车辆可以做到先进后出,队列里的车辆可以做到先进先出。

5.实验结果

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1  
#define OVERFLOW -2
typedef int Status;
typedef int Boolean;
typedef int ElemType;
const int STACK_SIZE = 1000;
const int QueueSize = 1000;
int MAX_STACK;
const int Max_num=1000;

//定义一个汽车结构体 
struct CAR{
    int time;//时间 
    string name;//车牌号 
    CAR(){}
    CAR(int t,string n):time(t),name(n){}
};

//定义一个栈结构体 
struct Stackk
{
    CAR s[Max_num];
    int index;
    void init()//创建栈 
	{ 
	    index=0;
	}
    bool empty()//判断栈空 
	{
        if(index==0)
            return 1;
        else
            return 0;
	}
    bool isfull()//判断栈满 
	{
	    if(index>=Max_num)
	        return 1;
        else
            return 0;
	}
    int size()//求栈的长度 
	{ 
	    return index;
	}
    void push(CAR x)//入栈 
	{ 
	    s[index++]=x; 
	}
    void pop()//出栈 
	{ 
	    index--;
	}
    CAR top()//返回栈顶元素 
	{ 
	    return s[index-1];
	}
}s;

//定义一个队列结构体 
struct Queuee
{
    CAR q[Max_num];
    int l,index;
    void init()//创建队列 
	{ 
	    l=0,index=0;
    }
    bool empty()//判断队列是否为空 
	{ 
	    if(l==index)
	        return 1;
        else
            return 0;
	}
    bool isfull()//判断队列是否为满 
	{
	    if(index>=Max_num)
	        return 1;
        else
            return 0;
	}
    int size()//求队列长度 
	{ 
	    return index-l;
	}
    void push(CAR x)//入队列 
	{ 
	    q[index++]=x; 
	}
    void pop()//出队列 
	{
	    l++;
	}
    CAR front()
	{ 
	    return q[l];
	}
    int find(string x)//找车牌号 
	{
        for(int i=l;i<=index;++i)
        if(q[i].name==x) return i;
        return -1;
    }
    void erase(string x)//抹去、删除 
	{
        for(int i=find(x);i<=index;++i)
        q[i]=q[i+1];
        --index;
    }
}q;

bool find(string x)
{
    Stackk tmp;//临时栈
    tmp.init();
    bool f=false;
    while(!s.empty())
	{
        if(s.top().name==x) f=true;
        tmp.push(s.top());
		s.pop();
    }
    while(!tmp.empty())
	{
        s.push(tmp.top());
		tmp.pop();
    }
    return f;
}

int main()
{
	int n,Q;
    cin>>n>>Q;
    s.init();
	q.init();
    while(Q--)
	{
        int t;
        string judge,car;
		cin>>judge>>car;
		cin>>t;
        if(judge=="arrive"){
            if((int)s.size()<n){
                s.push(CAR(t,car));
                cout<<"Stack "<<s.size()<<endl;
            }else{
                q.push(CAR(-1,car));
                cout<<"Queue "<<q.size()<<endl;
            }
        }
		else if(judge=="leave")
		{
            int tt=t;
            if(find(car))
			{
                Stackk tmp;//临时栈
				tmp.init();
                while(!s.empty()){//当栈不为空 
                    CAR now=s.top();//取栈顶元素now 
					s.pop();//出栈 
                    cout<<now.name<<':'<<"out ";
                    if(now.name==car)
					{
					    t-=now.time;
						break;
					}
                    tmp.push(now);
                }
                while(!tmp.empty())//当临时栈不为空 
				{
                    CAR now=tmp.top();
					tmp.pop();
                    cout<<now.name<<':'<<"in ";
                    s.push(now);//临时栈的栈顶元素进入栈 
                }
                if(((int)s.size()<n)&&(!q.empty()))
				{
                    CAR now=q.front();//取对头元素 
					q.pop();//出队 
                    if(now.time==-1) now.time=tt;
                    s.push(now);
                    cout<<now.name<<':'<<"in ";
                }
                printf("%d\n",t);
            }
			else
			{
                q.erase(car);
				puts("0");
            }
        }
    }
    return 0;
}

 

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值