SDUT 1466 雙向隊列
阿新 • • 發佈:2018-08-17
esc str inpu bit 之間 現在 ace 直接 雙向
雙向隊列
Time Limit: 1000 ms Memory Limit: 65536 KiBProblem Description
想想雙向鏈表……雙向隊列的定義差不多,也就是說一個隊列的隊尾同時也是隊首;兩頭都可以做出隊,入隊的操作。
現在給你一系列的操作,請輸出最後隊列的狀態;
命令格式:
LIN X X表示一個整數,命令代表左邊進隊操作;
RIN X 表示右邊進隊操作;
ROUT
LOUT 表示出隊操作;
Input
第一行包含一個整數M(M<=10000),表示有M個操作;
以下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
提示:這就體現出c++的強大之處了,寫雙向隊列自帶函數,只需點幾下,就能玩一年2333!!!敲上deque直接表示雙向隊列,具體操作按要求實現。
代碼實現如下(g++):
#include<bits/stdc++.h> usingnamespace std; int main() { int m; int i; char a[21]; int flag[100010]; int x; deque<int>t; scanf("%d",&m); for(i=1;i<=m;i++) { scanf("%s",a); if(strcmp(a,"LIN")==0) { scanf("%d",&x); t.push_front(x); }else if(strcmp(a,"RIN")==0) { scanf("%d",&x); t.push_back(x); } else if(strcmp(a,"LOUT")==0) { if(t.empty()) { flag[i]=1; } else t.pop_front(); } else if(strcmp(a,"ROUT")==0) { if(t.empty()) { flag[i]=1; } else t.pop_back(); } } int aa=t.front(); t.pop_front(); printf("%d",aa); while(!t.empty()) { int aa=t.front(); t.pop_front(); printf(" %d",aa); } printf("\n"); for(i=1;i<=m;i++) { if(flag[i]) { printf("%d ERROR\n",i); } } return 0; } /*************************************************** Result: Accepted Take time: 4ms Take Memory: 236KB ****************************************************/
SDUT 1466 雙向隊列