SPOJ ADAQUEUE

来源:互联网 发布:2017手机必备软件 编辑:程序博客网 时间:2024/05/19 08:44
题目大意:有四种操作,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);elsequ.push_back(temp);}if (strcmp(com, "push_back") == 0){scanf("%d", &temp);if (dir > 0)qu.push_back(temp);elsequ.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;}elsea[front] = temp;sum++;}if (strcmp(com, "push_back") == 0){scanf("%d", &temp);if (sum){rear += dir;a[rear] = temp;}elsea[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;}


原创粉丝点击