数据结构4

坑爹的实验哈~



实验四 停车场管理


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


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


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


呃。。。完全是模拟题嘛。。。

开始写的时候想的是用STL,到了最后发现,按老师的样例,每次操作之后要输出当前车库和当前过道的情况,这样的话在保证栈不被破坏的情况下得到元素就只好复制了,而STL中的 stack 和 queue 没有这个功能,所以,所以这个栈还是得自己老老实实地写,但是之前写的又懒得丢掉了,于是按着那种写法(q.pop()那种)哈哈,顺道用C++类封装起来用,也不错哈~


#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
class stack
{
private:
    int Top;
    long a[10];
public:
    stack()
    {
        Top=0;
        memset(a,0,sizeof(a));
    }
    void pop()
    {
        Top--;
    }
    void push(long no)
    {
        a[++Top]=no;
    }
    int top()
    {
        return a[Top];
    }
    int size()
    {
        return Top;
    }
    bool empty()
    {
        return Top;
    }
    void copy(stack p)
    {
        Top=p.size();
        for(int i=1;i<=Top;i++)
            a[i]=p.a[i];
    }
    void wu()
    {
        for(int i=1;i<=Top;i++)
            printf("%8ld",a[i]);
    }
};
stack p,l;
class queue
{
private:
    int num;
    long a[10];
public:
    queue()
    {
        num=0;
        memset(a,0,sizeof(a));
    }
    void push(long no)
    {
        a[++num]=no;
    }
    void pop()
    {
        for(int i=2;i<=num;i++)
            a[i-1]=a[i];
        num--;
    }
    int size()
    {
        return num;
    }
    int front()
    {
        return a[1];
    }
    void copy(queue q)
    {
        num=q.size();
        for(int i=1;i<=num;i++)
            a[i]=q.a[i];
    }
    void wu()
    {
        for(int i=1;i<=num;i++)
            printf("%8ld",a[i]);
    }
};
queue q;
int search_in_stack(long no);
int search_in_queue(long no);
void miao();
int main()
{
	while(1)
	{
		printf("按照要求输入指令:\n");
		printf("\t命令 A 表示:入\n");
		printf("\t命令 D 表示:进\n");
		printf("\t命令 Q 表示:退出\n");
		char s[10];
		scanf("%s",s);
		if(s[0]=='Q')
            break;
		long no;
		scanf("%ld",&no);
		if(s[0]=='A')
		{
			if(p.size()==5)
			{
				if(q.size()==8)
				{
				    printf("\t*********************************\n");
				    printf("\t*                               *\n");
					printf("\t*          过道已满!           *\n");
					printf("\t*                               *\n");
					printf("\t*********************************\n\n");
				}
				else
				{
					q.push(no);
				}
			}
			else
			{
				p.push(no);
			}
		}
		else if(s[0]=='D')
		{
		    if(p.size()==0)
		    {
		        printf("已空!\n");
		    }
		    else{
			if(search_in_stack(no))
			{
				while(no!=p.top())
				{
					long noo=p.top();
					p.pop();
					l.push(noo);
				}
				p.pop();
				while(l.size())
				{
					long noo=l.top();
					l.pop();
					p.push(noo);
				}
				if(q.size())
				{
					long no=q.front();
					q.pop();
					p.push(no);
				}

			}
			else if(search_in_queue(no))
			{
			    printf("************************************\n");
				printf("*  您的车正在排队中,暂时不能离开!*\n");
				printf("************************************\n");
			}
			else
                q.pop();
		}}
		miao();
	}
	return 0;
}
void miao()
{
	printf("停车场:\n");
	printf("------------------------------------------\n");
	printf("|\n");
	printf("|");
	p.wu();
	printf("\n");
	printf("|\n");
	printf("------------------------------------------\n\n\n");
	printf("过道:\n");
	printf("-----------------------------------------------------------------\n");
	printf("\n");
	printf(" ");
	q.wu();
	printf("\n");
	printf("\n");
	printf("-----------------------------------------------------------------\n\n\n\n");
	return ;
}
int search_in_stack(long no)
{
	stack pp(p);
	while(pp.size())
	{
		if(no==pp.top())
			return 1;
		pp.pop();
	}
	return 0;
}
int search_in_queue(long no)
{
    queue qq(q);
    if(no==q.front())
        return 0;
    while(qq.size())
    {
        if(no==qq.front())
            return 1;
        qq.pop();
    }
    return 0;
}


设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆次序。编制一程序模拟该停车场管理。(2) 实现要求:要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。(2) 实现提示:汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。例如,(’A’,1,5)表示1号牌照车在5时刻到达,而(’D’,5,20)表示5号牌照车在20时刻离去。整个程序可以在输入信息为(’E’,0,0)时结束。本题可用顺序存储结构和链式存储结构来实现。本人的一个数据结构课程设计(用C++源码实现,供大家学习参考之用,有不妥之处望指正)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值