双向队列
Time Limit: 1000 ms
Memory Limit: 65536 KiB
Problem Description
想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。
命令格式:
LIN X X表示一个整数,命令代表左边进队操作;
RIN X 表示右边进队操作;
ROUT
LOUT 表示出队操作;
Input
第一行包含一个整数M(M<=10000),表示有M个操作;
命令可能不合法,对于不合法的命令,请在输出中处理;
Output
输出的第一行包含队列进行了M次操作后的状态,从左往右输出,每两个之间用空格隔开;
对于不合法的命令,请输出一行X ERROR
其中X表示是第几条命令;
Sample Input
8 LIN 5 RIN 6 LIN 3 LOUT ROUT ROUT ROUT LIN 3
Sample Output
3 7 ERROR
Hint
Source
wanglin
解题思路:双向队列,操作起来还是挺方便的,stl里也有现成的库可以用,手敲一下还是有利于理解双向队列的结构。如果让我描述,我觉得有点像两个栈尾尾拼起来的感觉。这个题我用数组模拟,链式队列,还不太会用。
AC代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef struct que //数组模拟
{
int date[30000]; // 数据域
int fro; //头
int rea; //尾
int len; //长度
} Queue;
void InitDeque(Queue *Q) //初始化队列
{
Q->fro = 15000;
Q->rea = 15000;
Q->len = 0;
}
int main()
{
char com[100];
int error_mark[10010];
int i;
Queue Q;
InitDeque(&Q);
int t;
cin>>t;
memset(error_mark,0,sizeof(error_mark));
for(i = 1; i <= t; i++)
{
cin>>com; //输入操作指令,识别并执行。
if(!strcmp(com,"LIN"))
{
int a;
cin>>a;
Q.date[--Q.fro] = a;
Q.len++;
}
else if(!strcmp(com,"RIN"))
{
int a;
cin>>a;
Q.date[Q.rea++] = a;
Q.len++;
}
else if(!strcmp(com,"LOUT"))
{
if(Q.len > 0)
{
Q.fro++;
Q.len--;
}
else
{
error_mark[i] = 1;
}
}
else if(!strcmp(com,"ROUT"))
{
if(Q.len > 0)
{
Q.rea--;
Q.len--;
}
else
{
error_mark[i] = 1;
}
}
else
{
error_mark[i] = 1;
}
}
int flag = 0;
while(Q.fro < Q.rea)
{
if(flag == 0)
{
printf("%d", Q.date[Q.fro++]);
flag = 1;
}
else
{
printf(" %d", Q.date[Q.fro++]);
}
}
printf("\n");
for(i = 1; i <= t; i++)
{
if(error_mark[i] != 0)
{
printf("%d ERROR\n", i);
}
}
return 0;
}