refresh的停车场

refresh的停车场

Time Limit: 1000MS Memory limit: 65536K

题目描述

 refresh最近发了一笔横财,开了一家停车场。由于土地有限,停车场内停车数量有限,但是要求进停车场的车辆过多。当停车场满时,要进入的车辆会进入便道等待,最先进入便道的车辆会优先
进入停车场,而且停车场的结构要求只出去的车辆必须是停车场中最后进去的车辆。现告诉你停车场容量N以及命令数M,以及一些命令(Add num 表示车牌号为num的车辆要进入停车场或便道,
Del 表示停车场中出去了一辆车,Out 表示便道最前面的车辆不再等待,放弃进入停车场)。假设便道内的车辆不超过1000000.

输入

 输入为多组数据,每组数据首先输入N和M(0< n,m <200000),接下来输入M条命令。

输出

 输入结束后,如果出现停车场内无车辆而出现Del或者便道内无车辆而出现Out,则输出Error,否则输出停车场内的车辆,最后进入的最
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 22000
int nn;
typedef struct
{
    long long *top;
    long long *end;
    int len;
    int list;
}sq;
typedef struct
{
    long long *a;
    int front;
    int rear;
}qu;
void initl(sq &l)
{
    l.end=(long long*)malloc(max*sizeof(long long));
    l.top=l.end;
    l.len=0;
    l.list=max;
}
void inits(qu &s)
{
    s.a=(long long *)malloc(max*sizeof(long long));
    s.front=0;
    s.rear=s.front;
}
void bianadd(qu &s,long long num)
{
    if(s.rear<1000000)
    {
        s.a[s.rear]=num;
        s.rear++;
    }
}
void add(sq &l,qu &s,long long num)
{
    if(l.len<nn)
    {
        *l.top=num;
        l.top++;
        l.len++;
    }
    else
    {
        bianadd(s,num);
    }
}
void del(sq &l,qu &s)
{
    l.top--;
    l.len--;
    if(s.rear>s.front)
    {
        *l.top=s.a[s.front];
        l.top++;
        l.len++;
        for(int i=s.front;i<s.rear-1;i++)
        {
            s.a[i]=s.a[i+1];
        }
        s.rear--;
    }
    //printf("%lld ",*(l.top-1));
}
void out(qu &s)
{
    int i;
    for(i=s.front;i<s.rear-1;i++)
        s.a[i]=s.a[i+1];
    s.rear--;
}
void dis(sq &l,int t)
{
    if(t==1) printf("Error\n");
    else
    {
        while(l.top>l.end)
        {
            printf("%lld\n",*(l.top-1));
            l.top--;
        }
    }
}
int main()
{
    int n,m;
    sq l;
    qu s;
    int t;
    while(~scanf("%d %d",&n,&m))
    {
        t=0;
        nn=n;
        initl(l);
        inits(s);
        while(m--)
        {
            char c[100];
            scanf("%s",c);
            if(c[0]=='A')
            {
                long long num;
                scanf("%lld",&num);
                add(l,s,num);
            }
            else if(c[0]=='D')
            {
                if(l.top==l.end) t=1;
                else del(l,s);
            }
            else if(c[0]=='O')
            {
                if(s.front==s.rear) t=1;
                else out(s);
            }
        }
        dis(l,t);
    }
        return 0;
}

先输出,无车辆不输出。

示例输入

2 6
Add 18353364208
Add 18353365550
Add 18353365558
Add 18353365559
Del
Out

示例输出

18353365558
18353364208

提示

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值