栈和队列的应用之停车问题

题目:

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

基本要求:

        以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入数据的序列进行模拟管理.每一组输入数据包括三个数据:汽车的“到达”(’A’表示)或“离去”(’D’表示)信息,汽车标识(牌照号)以及到达或离去的时刻.对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或者便道上的停车位置;若是车辆离去,则输出汽车在停车场停留的时间和应缴纳的费用(便道上不收费).栈以顺序结构实现,队列以链表结构实现

测试数据

        设 n=2,输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0).其中’A’ 表示到达(Arrival),’D’表示离开(Departure),’E’表示结束(End)

时间为相对分钟数.用C++编的程序,还要有头文件!

代码:

#include<iostream>
#include<bits/stdc++.h> 
using namespace std;

typedef struct SL{
	int id[100];
	int time[100];
	int top;
}SL;

//顺序栈入栈 
void Push(SL &S, int x, int y){
	 	S.top++;
	 	S.id[S.top] = x;
	 	S.time[S.top] = y;
}

//进站
void input(int MAX, int id, int time, SL &S, SL &Sb){
    //cout << "2";
    if(S.top == MAX-1){
        Sb.top++;
        Sb.id[Sb.top]  = id; 
        cout << "车牌号是" << Sb.id[Sb.top] << "的车在便道的位置是" << Sb.top+1+1 << endl;
    }else{
        Push(S, id ,time);
        cout << "车牌号是" << S.id[S.top] << "的车在停车场的位置是" << S.top+1 << endl;
    }
}

//出站
void output(int id, int time, SL &S, int MAX, int Money, SL &Sb){
    SL S1;
    S1.top = -1;
    while(1){
        if(id == S.id[S.top]){
            cout << "车牌号是" << id << "的车在停车场停留的时间为" << time-S.time[S.top] << "小时,共花费了" << (time-S.time[S.top])*Money << "元" << endl;
            S.top--;
            break;
        }else{
            S1.top++;
            S1.id[S1.top]   = S.id[S.top];
            S1.time[S1.top] = S.time[S.top]; 
            S.top--;
        }
    }
}

int main(){
    SL S,Sb;
    S.top  = -1;//停车场
    Sb.top = -1;//便道
    
    int MAX,Money;
    cout << "请输入停车场最大容量(辆)以及车在停车场每小时的费用(元):" << endl;
    cin >> MAX >> Money;
    
    char n;
    int id,time;
    
    cout << "请输入车的状态(A进站/D出站),车牌号以及时间(进站时间/出站时间):" << endl;
    while(1){    
        
        cin >> n >> id >> time;
        switch(n){
            case 'a':
            case 'A':
            //cout << "1";
                input(MAX,id,time,S,Sb);
                break;
            case 'd':
            case 'D':
                output(id,time,S,MAX,Money,Sb);
                break;
            case 'e':
            case 'E':
                exit(0);
            default:
                cout << "状态信息输入有误!!!" << endl;
        }
    }
    return 0;
}

效果图:

猜你喜欢

转载自blog.csdn.net/qq_42680327/article/details/130021695