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

   自动停车场由一个可停放n 辆车的狭长通道构成,且只有一个入口可供汽车进出。在停车场内,汽车按到达的先后次序,由北向南依次排列(假设入口在最南端)。若停车场内已停满n 辆车,则后来的汽车需在入口外的临时等候便道上等候,当有车要离开时,临时等候便道上的第一辆车即可进入。当自动停车场内某辆车要离开时,必须先将在它之后
进入的车辆移出为其让路,待该辆车离开后,其他车辆再按原次序移入自动停车场。每辆车离开自动停车场时,应按其停留时间的长短交费(在临时等候便道上停留的时间不收费)。

//head.h
#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define maxstacksize 4
#define maxqueuesize 5
struct Elem
{
    char op;
    char id[10];
    int hour;
    int minu;
};
struct Stack
{
    Elem* base;
    Elem* top;
    int stacksize;
};
struct QNode
{
    Elem data;
    QNode* next;
};
struct Queue
{
    QNode* Front;
    QNode* Rear;
    int queuesize;
};
void InitStack(Stack &s);
Elem GetTop(Stack s);
void push(Stack &s, Elem e);
Elem pop(Stack &s);
void InitQueue(Queue &q);
void EnQueue(Queue &q, Elem e);
Elem DeQueue(Queue &q);
int calculate_expense(Elem a, Elem b);
void solve(Stack s, Stack s2, Queue q);
#endif // HEAD_H_INCLUDED
//main.cpp
#include "head.h"
int main()
{
    Stack s, s2;
    Queue q;
    freopen("in.txt", "r", stdin);
    //freopen("out.txt","w", stdout);
    InitStack(s);
    InitStack(s2);
    InitQueue(q);
    printf("请输入需要进行的操作(L:离开,A:到达),您的车牌号及时间(时:分):\n\n");
    solve(s, s2, q);
    return 0;
}
//Solve.cpp
#include "head.h"
void solve(Stack s, Stack s2, Queue q)
{
    char op;             //进行的操作
    char id[10];         //车牌号
    int hour, minu;      //时间:小时,分钟
    while(scanf("%c %s %d:%d",&op, id, &hour, &minu) != EOF)
    {
        Elem car;
        car.op = op;
        strcpy(car.id, id);
        car.hour = hour;
        car.minu = minu;
        if(op == 'A')                           //车辆到达
        {
            if(s.stacksize < maxstacksize)      //停车场未满
            {
                push(s, car);
                printf("您的汽车 %s 停于自动停车场第 %d 号位置\n",car.id, s.stacksize);
            }
            else
            {
                if(q.queuesize < maxqueuesize)  //临时停车场未满
                {
                   EnQueue(q, car);
                   printf("您的汽车 %s 停于临时停车场第 %d 号位置\n",car.id, q.queuesize);
                }
                else
                printf("对不起,临时停车场已满\n");
            }
        }
        else if(op == 'L')                       //车辆离开
        {
            while(1)
            {
                Elem e = GetTop(s);
                if(strcmp(e.id, car.id) == 0)
                {
                    pop(s);
                    printf("%s 应收取的费用为: %d\n",e.id ,calculate_expense(e, car));
                    break;
                }
                else
                {
                    pop(s);
                    push(s2, e);
                }
            }
            while(s2.stacksize != 0)
            {
                Elem e = GetTop(s2);
                pop(s2);
                push(s, e);
            }
            if(q.queuesize > 0)
            {
                Elem e = DeQueue(q);
                e.hour = car.hour;
                e.minu = car.minu;
                push(s, e);
            }
        }
        getchar();
    }
    return;
}
//Stack_Operation.cpp
#include "head.h"
void InitStack(Stack &s)
{
   s.base = new Elem[maxstacksize];
   s.top = s.base;
   s.stacksize = 0;
}
Elem GetTop(Stack s)
{
   return *(s.top - 1);
}
void push(Stack &s, Elem e)
{
   *s.top++ = e;
   s.stacksize ++;
}
Elem pop(Stack &s)
{
   s.top --;
   s.stacksize --;
   return *s.top;
}
//Queue_Operation.cpp
#include "head.h"
void InitQueue(Queue &q)
{
   q.Front = q.Rear = new QNode;
   q.Front->next = NULL;
   q.Rear->next = NULL;
   q.queuesize = 0;
}
void EnQueue(Queue &q, Elem e)
{
   QNode* p = new QNode;
   p -> data = e;
   p -> next = NULL;
   q.Rear -> next = p;
   q.Rear = p;
   q.queuesize ++;
}
Elem DeQueue(Queue &q)
{
    QNode* p = q.Front->next;
    Elem e = p->data;
    q.Front->next = p->next;
    if(q.Rear == p)
        q.Rear = q.Front;
    delete p;
    q.queuesize --;
    return e;
}
//Calculate_Expense.cpp
#include "head.h"
int calculate_expense(Elem a, Elem b)
{
    int hour1 = a.hour, hour2 = b.hour;
    int min1 = a.minu, min2 = b.minu;
    int ans = hour2*60+min2 - (hour1*60+min1);
    return ans;
}

测试数据:

Input:

A 001 07:00
A 002 07:30
A 003 07:40
A 004 08:00
A 005 09:05
A 006 10:00
A 007 11:25
A 008 12:20
A 009 12:23
A 010 14:00
L 001 15:00
L 002 15:30
L 006 16:00
A 011 16:30

Output:

输入需要进行的操作(L:离开,A:到达),您的车牌号及时间(时:分):

您的汽车 001 停于自动停车场第 1 号位置
您的汽车 002 停于自动停车场第 2 号位置
您的汽车 003 停于自动停车场第 3 号位置
您的汽车 004 停于自动停车场第 4 号位置
您的汽车 005 停于临时停车场第 1 号位置
您的汽车 006 停于临时停车场第 2 号位置
您的汽车 007 停于临时停车场第 3 号位置
您的汽车 008 停于临时停车场第 4 号位置
您的汽车 009 停于临时停车场第 5 号位置
对不起,临时停车场已满
001 应收取的费用为: 480
002 应收取的费用为: 480
006 应收取的费用为: 30
您的汽车 011 停于临时停车场第 3 号位置

         

    原文作者:停车场模拟问题
    原文地址: https://blog.csdn.net/mowenwen_/article/details/48999579
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞