双向队列
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
<span style="color:#330033;">#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 11000
int a[11000],j;
typedef int element;
typedef struct
{
element *rear,*front;
int len;
} Sq;
int init(Sq &L)
{
L.front=new element[MAXSIZE];
if(!L.front)
exit(-1);
L.rear=L.front+5000;
L.front=L.rear;
L.len=0;
return 1;
}
int lpush(Sq &L,int x)
{
if(L.front>L.rear)
return -1;
*L.front=x;
L.front--;
return 1;
}
int rpush(Sq &L,int x)
{
if(L.front>L.rear)
return -1;
L.rear++;
*L.rear=x;
return 1;
}
int lpop(Sq &L,int i)
{
if(L.front==L.rear)
{
a[j]=i+1;
j++;
return 0;
}
L.front++;
return 0;
}
int rpop(Sq &L,int i)
{
if(L.front==L.rear)
{
a[j]=i+1;
j++;
return 0;
}
L.rear--;
return 0;
}
int pop(Sq &L)
{
while(L.front<L.rear)
{
if(L.front+1==L.rear)
printf("%d\n",*(++L.front));
else
printf("%d ",*(++L.front));
}
return 0;
}
int main()
{
int m,x;
char s[5];
Sq L;
j=0;
scanf("%d",&m);
init(L);
for(int i=0; i<m; i++)
{
scanf("%s",s);
if(!strcmp(s,"LIN"))
{
scanf("%d",&x);
lpush(L,x);
}
else if(!strcmp(s,"RIN"))
{
scanf("%d",&x);
rpush(L,x);
}
else if(!strcmp(s,"LOUT"))
{
lpop(L,i);
}
else
{
rpop(L,i);
}
}
pop(L);
for(int i=0; i<j; i++)
printf("%d ERROR\n",a[i]);
return 0;
}
</span>
标签:return,队列,Sq,++,int,双向,front,rear From: https://blog.51cto.com/u_15879559/5868798