想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。
<o:p></o:p>现在给你一系列的操作,请输出最后队列的状态;
<o:p></o:p>命令格式:
<o:p></o:p>LIN X X表示一个整数,命令代表左边进队操作;
<o:p></o:p>RIN X 表示右边进队操作;
<o:p></o:p>ROUT
<o:p></o:p>LOUT 表示出队操作;<o:p></o:p>
Input
第一行包含一个整数M(M<=10000),表示有M个操作;
<o:p></o:p>以下M行每行包含一条命令;
<o:p></o:p>命令可能不合法,对于不合法的命令,请在输出中处理;<o:p></o:p>
Output
输出的第一行包含队列进行了M次操作后的状态,从左往右输出,每两个之间用空格隔开;
<o:p></o:p>以下若干行处理不合法的命令(如果存在);
<o:p></o:p>对于不合法的命令,请输出一行X ERROR
<o:p></o:p>其中X表示是第几条命令;<o:p></o:p>
Sample
Input
8
LIN 5
RIN 6
LIN 3
LOUT
ROUT
ROUT
ROUT
LIN 3
Output
3
7 ERROR
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char c[10];
int x,n,sum=0,num=0,flag=0,a[10001],b[10001],i,j;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
scanf("%s",c);
if(strcmp(c,"LIN")==0)
{
scanf("%d",&x);
if(sum==0)
a[sum++]=x;
else
{
for(j=sum; j>0; j--)
{
a[j]=a[j-1];
}
a[0]=x;//赋予输入值
sum++;
}
}
if(strcmp(c,"RIN")==0)//右加一个数相对容易
{
scanf("%d",&x);
a[sum++]=x;
}
if(strcmp(c,"LOUT")==0)
{
if(sum==0)//若此时指令非法,则储存在数组b中
{
flag=1;
b[num++]=i;
}
else
{
for(j=0; j<sum-1; j++)
{
a[j]=a[j+1];
}
sum--;
}
}
if(strcmp(c,"ROUT")==0)
{
if(sum==0)//若此时指令非法,则储存在数组b中
{
flag=1;
b[num++]=i;
}
else//队列的大小减一即可
{
sum--;
}
}
}
for(i=0; i<sum; i++)
{
if(i==sum-1)
printf("%d\n",a[i]);
else
printf("%d ",a[i]);
}
if(flag>0)//若有非法指令,则将b数组输出
{
for(i=0; i<num; i++)
{
printf("%d ERROR\n",b[i]);
}
}
return 0;
}