1. 程式人生 > >資料結構實驗 停車場管理系統(實驗3)

資料結構實驗 停車場管理系統(實驗3)

程式碼:

/*
2018年11月12日
*/
#include<stdio.h>
#include<string>
#include<algorithm>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define PRICE 10
#define MAXN  2
/*
停車場管理系統
1.進車
如果停車場沒滿  進進車, 否則進入人行道的佇列
輸入進入時間


2.出車
如果在停車場出車   講棧底元素取出即可.在人行道可直接根據佇列元素出來
*/
class Car
{
public:
    string CarNum;
    int ArrTime;
    int AwayTime;
public:
    Car(string s,int arrtime):CarNum(s),ArrTime(arrtime)
    {
        AwayTime=-1;
    }
    Car()
    {

    }
    void SetAwayTime(int awaytime)
    {
        AwayTime=awaytime;
    }
    void SetArrTime(int arrtime)
    {
        ArrTime=arrtime;
    }
};
class Manager
{
private:
    queue<Car> SideWalkOfCar;
    stack<Car> Parking;
    stack<Car> MidCar;
public:
    Manager()
    {
        while(!SideWalkOfCar.empty())
            SideWalkOfCar.pop();
        while(!Parking.empty())
            Parking.pop();
        while(!MidCar.empty())
            MidCar.pop();
    }
    bool AddCar(Car car)//新增車
    {
        /*
        如果停車場沒滿就加入停車場
        滿 則停到過道,並且把進入停車場時間設為-1
        */
        if(Parking.size()<MAXN)
            Parking.push(car);
        else
        {
            SideWalkOfCar.push(car);
            car.ArrTime=-1;
        }
        return 1;
    }
    Car DelCar(string carnum,int awaytime)//刪除車 根據車牌號刪除車輛
    {
        int flag=0;//檢視車是否在停車場
        Car nowcar;
        while(!Parking.empty())
        {
            if(Parking.top().CarNum==carnum)
            {
                flag=1;
                nowcar=Parking.top();
                nowcar.AwayTime=awaytime;
                Parking.pop();
                break;
            }
            MidCar.push(Parking.top());
            Parking.pop();
        }
        while(!MidCar.empty())
        {
            Parking.push(MidCar.top());
            MidCar.pop();
        }
        if(flag)//從停車場出來了
        {
            if(!SideWalkOfCar.empty())
            {
                //將便道上的車 進入停車場並且設定進入停車場時間
                Car mmm;
                mmm=SideWalkOfCar.front();
                mmm.ArrTime=awaytime;
                SideWalkOfCar.pop();
                Parking.push(mmm);
            }
            return nowcar;
        }
        else//停車場沒有
        {
            int cnt=SideWalkOfCar.size();
            while(cnt--)
            {
                Car mmm;
                mmm=SideWalkOfCar.front();
                SideWalkOfCar.pop();
                if(mmm.CarNum==carnum)
                {
                    mmm.ArrTime=-1;
                    return mmm;
                }
                SideWalkOfCar.push(mmm);
            }
        }
        return Car("ERROR",-1);
    }
    int Charge(Car car)//根據車算出收費
    {
        if(car.ArrTime==-1)
            return 0;
        return (car.AwayTime-car.ArrTime)*PRICE;
    }
};
int main()
{
    Manager dch;
    int IfContinue=1;
    while(IfContinue)
    {
        cout<<"what do you want to do?"<<endl;
        cout<<"Input ----(add/del/exit)"<<endl;
        char cmd[5];
        scanf("%s",cmd);
        switch(cmd[0])
        {
        case 'a':
        {
            string num;
            int arrtime;
            cout<<"input the number And arrtime:";
            cin>>num>>arrtime;
            dch.AddCar(Car(num,arrtime));
            break;
        }
        case 'd':
        {
            string num;
            int awaytime;
            cout<<"input the number And awaytime:";
            cin>>num>>awaytime;
            Car dchOfCar=dch.DelCar(num,awaytime);
            cout<<"charge:"<<dch.Charge(dchOfCar);
            break;
        }
        case 'e':
        {
            IfContinue=0;
            scanf("%*s %*d");
            break;
        }
        default:
            printf("input error!---please input again:\n");
            break;
        }
    }
}