双端队列篇deque SDUT OJ 双向队列

双向队列

Time Limit: 1000MS Memory limit: 65536K

题目描述

      想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。
现在给你一系列的操作,请输出最后队列的状态;
命令格式:
LIN X  X表示一个整数,命令代表左边进队操作;
RIN X  表示右边进队操作;
ROUT
LOUT   表示出队操作;

输入

第一行包含一个整数M(M<=10000),表示有M个操作;
以下M行每行包含一条命令;
命令可能不合法,对于不合法的命令,请在输出中处理;

输出

输出的第一行包含队列进行了M次操作后的状态,从左往右输出,每两个之间用空格隔开;
以下若干行处理不合法的命令(如果存在);
对于不合法的命令,请输出一行X ERROR
其中X表示是第几条命令;

示例输入

8
LIN 5
RIN 6
LIN 3
LOUT
ROUT
ROUT
ROUT
LIN 3

示例输出

3
7 ERROR

双端队列的典型操作模拟题!一开始读错题了,WA一次!
注意:先输出处理完这m条命令后 队列里还有什么数据, 然后再依次输出报错的指令信息!
#include <iostream>
#include <string>
#include <stdio.h>
#include <string.h>
#include <map>
#include <stack>
#include <deque> //双端队列
#include <algorithm>
#include <ctype.h>

using namespace std;


int a[20000], e;

int main()
{
    int m;
    cin>>m;
    int i, j, dd;
    string s;
    deque<int>q;
    deque<int>::iterator it;

    for(i=1; i<=m; i++)
    {
        cin>>s;
        if(s=="LIN")
        {
            cin>>dd;
            q.push_front(dd);
        }
        else if(s=="RIN")
        {
            cin>>dd;
            q.push_back(dd);
        }
        else if(s=="LOUT")
        {
            if(q.empty())
            {
                a[e++]=i;
            }
            else
            {
                q.pop_front();
            }
        }
        else if(s=="ROUT")
        {
            if(q.empty())
            {
                a[e++]=i;
            }
            else
            {
                q.pop_back();
            }
        }
    }

    int flag=0;
    for(it=q.begin(); it!=q.end(); it++)
    {
        if(flag==0)
        {
            printf("%d", *it );
            flag=1;
        }
        else if(flag==1)
        {
            printf(" %d", *it );
        }
    }

    if(flag==1)
    {
        printf("
");  //如果flag==1 就表示最后状态的队列里还有数据,输出完这些数据后就要输出换行! 如果flag==0, 则没有必要换行了!
    }
    for(j=0; j<e; j++)
    {
        printf("%d ERROR
", a[j] );
    }
    return 0;
}
 
原文地址:https://www.cnblogs.com/yspworld/p/4079827.html