题目大意:有四种操作,back输出队尾,去列尾;front输出队首,去队首;reverse颠倒队列;push_back N尾端插入N;toFront N首端插入N。如果操作失败,也就是队空时,希望输出队首队尾,就输出"No job for Ada?"

解题思路:用双向队列,就是简单的调用函数了,颠倒时,也由一个变量标记,使正常接下来的操作尾变头,头变尾。或者模拟,队首队尾分别标记,一个方向变量初始为1表示未颠倒过队列,颠倒时方向变量变号,首尾标记交换。

双向队列ac代码:

#include <iostream>
#include <cstring>
#include <deque>
using namespace std;
deque <int>qu;
int main()
{
int t, temp, dir;
char com[1005];
while (scanf("%d", &t)!=EOF){
dir = 1;
for (int i=1; i<=t; i++){
scanf("%s", com);
if (strcmp(com, "toFront") == 0){
scanf("%d", &temp);
if (dir > 0)
qu.push_front(temp);
else
qu.push_back(temp);
}
if (strcmp(com, "push_back") == 0){
scanf("%d", &temp);
if (dir > 0)
qu.push_back(temp);
else
qu.push_front(temp);
}
if (strcmp(com, "front") == 0){
if (qu.empty())
printf("No job for Ada?\n");
else{
if (dir > 0){
printf("%d\n", qu.front());
qu.pop_front();
}
else{
printf("%d\n", qu.back());
qu.pop_back();
}
}
}
if (strcmp(com, "back") == 0){
if (qu.empty())
printf("No job for Ada?\n");
else{
if (dir > 0){
printf("%d\n", qu.back());
qu.pop_back();
}
else{
printf("%d\n", qu.front());
qu.pop_front();
}
}
}
if (strcmp(com, "reverse") == 0)
dir = -dir;
}
qu.clear();
}
return 0;
}

模拟ac代码:

#include <iostream>
#include <cstring>
using namespace std;
int a[1000005];
int main()
{
int t, front, rear, dir, temp, sum;
char com[1005];
while (scanf("%d", &t)!=EOF){
dir = 1;
sum = 0;
front = rear = 1000005 / 2;
for (int i=1; i<=t; i++){
scanf("%s", com);
if (strcmp(com, "toFront") == 0){
scanf("%d", &temp);
if (sum){
front -= dir;
a[front] = temp;
}
else
a[front] = temp;
sum++;
}
if (strcmp(com, "push_back") == 0){
scanf("%d", &temp);
if (sum){
rear += dir;
a[rear] = temp;
}
else
a[rear] = temp;
sum++;
}
if (strcmp(com, "front") == 0){
if (!sum)
printf("No job for Ada?\n");
else{
printf("%d\n", a[front]);
sum--;
if (sum)
front += dir;
}
}
if (strcmp(com, "back") == 0){
if (!sum)
printf("No job for Ada?\n");
else{
printf("%d\n", a[rear]);
sum--;
if (sum)
rear -= dir;
}
}
if (strcmp(com, "reverse") == 0 && sum){
dir = -dir;
temp = rear;
rear = front;
front = temp;
}
}
}
return 0;
}