双向队列

来源:互联网 发布:网易博客发帖软件 编辑:程序博客网 时间:2024/05/22 03:43

题目描述

      想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。
现在给你一系列的操作,请输出最后队列的状态;
命令格式:
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 <stdlib.h>
#include <string.h>
#define maxsize 10000
typedef int element;
typedef struct
{
   element *base;
   int front,rear;
}sq;
int intiqueue(sq*q)
{
   q->base=(element*)malloc(maxsize*sizeof(element));
   if(!q->base)
    return -1;
    q->front=q->rear=maxsize/2;
    return 0;
}
int main()
{
    int m,x,b[maxsize],i,j=0,t;
    char a[10];
    sq q;
    scanf("%d",&m);
    t=m;
    intiqueue(&q);
    while(m--)
    {
      scanf("%s",a);
      if(strcmp(a,"LIN")==0)
      {
         scanf("%d",&x);
         q.base[--q.front]=x;
      }
      else if(strcmp(a,"RIN")==0)
      {

            scanf("%d",&x);
            q.base[q.rear++]=x;

      }
      else if(strcmp(a,"LOUT")==0)
      {
          if(q.front==q.rear)
            b[j++]=t-m;
          else
          {
              q.front++;

          }
      }
      else if(strcmp(a,"ROUT")==0)
      {
         if(q.front==q.rear)
            b[j++]=t-m;
         else
         {
            q.rear--;
         }
      }

    }
      for(i=q.front;i<q.rear;i++)
      {
          if(i==q.rear-1)
            printf("%d\n",q.base[i]);
          else printf("%d ",q.base[i]);
      }
      for(i=0;i<j;i++)
        printf("%d ERROR\n",b[i]);
    return 0;
}

 

0 0
原创粉丝点击