1. 程式人生 > >SDUT 1466 雙向隊列

SDUT 1466 雙向隊列

esc str inpu bit 之間 現在 ace 直接 雙向

雙向隊列

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem 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>

using
namespace 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 雙向隊列