双向队列
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
提示
来源
wanglin
示例程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
int data;
node *next;
};
typedef struct
{
node *life;
node *right;
} Queue;
int init(Queue *Q)
{
Q->life=Q->right=(node *)malloc(sizeof(node));
if(!Q->life) return 0;
Q->life->next=NULL;
Q->right->next=NULL;
return 1;
}
void Lin(Queue *Q,int e)
{
node *p,*q;
p=(node *)malloc(sizeof(node));
if(!Q->life) exit(0);
p->data=e;
// if(Q->life==Q->right)
// Q->life->next=NULL;
p->next=Q->life->next;
Q->life->next=p;
q=Q->life; /*一直让right指针指向队尾*/
while(q->next)
{
q=q->next;
}
Q->right=q;
}
void Rin(Queue *Q,int e)
{
node *p,*tail;
p=(node *)malloc(sizeof(node));
if(!Q->life) exit(0);
p->data=e;
p->next=NULL;
Q->right->next=p;
Q->right=p;
}
void Rout(Queue *Q,int k)
{
if(Q->life==Q->right) return;
int e;
node *p,*q;
p=Q->right;
q=Q->life;
while(q->next!=Q->right)
{
q=q->next;
}
Q->right=q;
Q->right->next=NULL;
free(p);
}
void Lout(Queue *Q,int k)
{
int e;
node *p;
p=Q->life->next;
Q->life->next=p->next;
if(Q->right==p)
Q->right=Q->life;
free(p);
}
int main()
{
int n,x,k,i,f[500];
char a[16];
Queue Q;
init(&Q);
node *p;
scanf("%d",&n);
k=0;
for(i=1; i<=n; i++)
{
scanf("%s",a);
if(strcmp(a,"LIN")==0)
{
scanf("%d",&x);
Lin(&Q,x);
}
if(strcmp(a,"RIN")==0)
{
scanf("%d",&x);
Rin(&Q,x);
}
if(strcmp(a,"ROUT")==0)
{
if(Q.life==Q.right)
f[k++]=i;
else
Rout(&Q,x);
}
if(strcmp(a,"LOUT")==0)
{
if(Q.life==Q.right)
f[k++]=i;
else
Lout(&Q,x);
}
}
p=Q.life->next;
// printf("**");
while(p)
{
printf("%d",p->data);
p=p->next;
if(p)
printf(" ");
else
printf("\n");
}
if(k)
{
for(i=0;i<k;i++)
printf("%d ERROR\n",f[i]);
}
}