首页 > 代码库 > 双端队列篇deque SDUT OJ 双向队列

双端队列篇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表示是第几条命令;

示例输入

8LIN 5RIN 6LIN 3LOUTROUTROUTROUTLIN 3

示例输出

37 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("\n");  //如果flag==1 就表示最后状态的队列里还有数据,输出完这些数据后就要输出换行! 如果flag==0, 则没有必要换行了!    }    for(j=0; j<e; j++)    {        printf("%d ERROR\n", a[j] );    }    return 0;}

 

 

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