双向队列

来源:互联网 发布:matlab处理心电图数据 编辑:程序博客网 时间:2024/05/01 09:46

题目描述

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

输入

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

输出

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

示例输入

8LIN 5RIN 6LIN 3LOUTROUTROUTROUTLIN 3

示例输出

37 ERROR
#include<stdio.h>#include<string.h>#include<stdlib.h>int ls[20000], a[10010];int main(){    int n;    while(~scanf("%d",&n))    {        memset(ls,0,sizeof(ls));        int i,d,l = 10000, r = 10001, k = 0;        char b[25];        for(i = 1; i <= n; i++)        {            scanf("%s",b);            if(strcmp(b,"LIN") == 0)            {                scanf("%d",&d);                ls[l--] = d;            }            else if(strcmp(b,"RIN") == 0)            {                scanf("%d",&d);                ls[r++] = d;            }            else if(strcmp(b,"LOUT") == 0)            {               if(l == r-1)               {                   a[k++] = i;               }               else                l++;            }            else if(strcmp(b,"ROUT") == 0)            {                if(l == r-1)                {                    a[k++] = i;                }                else                 r--;            }        }        for(i = l+1; i < r; i++)        {            printf("%d",ls[i]);            if(i < r-1)             printf(" ");        }        printf("\n");        for(i = 0; i < k; i++)          printf("%d ERROR\n",a[i]);    }    return 0;}


0 0