暑假集训 8.2 双向队列的手写与STL sdutoj1466 双向队列
2016-08-02 20:46
363 查看
双向队列
Time Limit: 1000MS Memory limit: 65536K
题目描述
想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。现在给你一系列的操作,请输出最后队列的状态;
命令格式:
LIN X X表示一个整数,命令代表左边进队操作;
RIN X 表示右边进队操作;
ROUT
LOUT 表示出队操作;
输入
第一行包含一个整数M(M<=10000),表示有M个操作;以下M行每行包含一条命令;
命令可能不合法,对于不合法的命令,请在输出中处理;
输出
输出的第一行包含队列进行了M次操作后的状态,从左往右输出,每两个之间用空格隔开;以下若干行处理不合法的命令(如果存在);
对于不合法的命令,请输出一行X ERROR
其中X表示是第几条命令;
示例输入
8 LIN 5 RIN 6 LIN 3 LOUT ROUT ROUT ROUT LIN 3
示例输出
3 7 ERROR
///简单明了,按着题目要求做就行....
///STL ACcode
#include <iostream> #include <deque> #include <cstring> using namespace std; int main() { int n,i,a; char s[13]; bool ma[10010]= {0}; deque<int> q; cin>>n; for (i=1; i<=n; i++) { cin>>s; if (strcmp(s,"LOUT")==0) { if (!q.empty()) { q.pop_front(); } else if (q.empty()) { ma[i]=1; } } else if (strcmp(s,"ROUT")==0) { if (!q.empty()) { q.pop_back(); } else if (q.empty()) { ma[i]=1; } } else if (strcmp(s,"LIN")==0) { cin>>a; q.push_front(a); } else if (strcmp(s,"RIN")==0) { cin>>a; q.push_back(a); } } while(!q.empty()) { cout<<*q.begin()<<" "; q.pop_front(); } cout<<endl; for (i=1; i<=n; i++) { if (ma[i]) { cout<<i<<" ERROR"<<endl; } } return 0; }
///手写 ACcode
#include <iostream> #include <cstring> using namespace std; const int maxn=100010; bool ma[maxn]= {0}; typedef int elemtype; typedef struct queue { elemtype *r,*l,*mid; elemtype Size; } queue; void Creat(queue &q) { q.r=new elemtype[maxn]; q.l=q.r+maxn/2; q.r=q.l; q.mid=q.r; q.Size=maxn; } void rout(queue &q,int i) { if (q.r<q.l) { ma[i]=1; } else if (q.r!=q.mid) { q.r--; } else if (q.l==q.mid&&q.r==q.mid) { ma[i]=i; } else if (q.r==q.mid) { q.r-=2; } } void lout(queue &q,int i) { if (q.l>q.r) { ma[i]=1; } else if (q.l!=q.mid) { q.l++; } else if (q.l==q.mid&&q.r==q.mid) { ma[i]=i; } else if (q.l==q.mid) { q.l+=2; } } void lin(queue &q,int n) { q.l--; *q.l=n; } void rin(queue &q,int n) { q.r++; *q.r=n; } void out(queue &q) { if (q.l<=q.r) { while (q.l!=q.r) { if (q.l!=q.mid) { cout<<*q.l<<" "; } q.l++; } if (q.l!=q.mid) { cout<<*q.l<<" "; } } cout<<endl; } void error(int n) { int i; for (i=1; i<=n; i++) { if (ma[i]) { cout<<i<<" ERROR"<<endl; } } } int main() { int n,m,i,a; char s[13]; queue q; Creat(q); cin>>n; for (i=1; i<=n; i++) { cin>>s; if (strcmp(s,"LIN")==0) { cin>>a; lin(q,a); } else if (strcmp(s,"RIN")==0) { cin>>a; rin(q,a); } else if (strcmp(s,"LOUT")==0) { lout(q,i); } else if(strcmp(s,"ROUT")==0) { rout(q,i); } } out(q); error(n); return 0; }
///改天写题解 以及STL双向队列函数的使用说明
相关文章推荐
- SDUT 1466 双向队列
- SDUT 1466 双向队列
- SDUT-1466 双向队列
- SDUT1466双向队列
- 双向队列 SDUT 1466
- sdut 双向队列(STL)
- SDUT 1466 双向队列
- sdut 1466 双向队列
- 暑假集训日记--8.14--单调队列
- STL之deque(双向队列)
- STL之deque双向队列
- STL系列之一 deque双向队列
- STL系列之一 deque双向队列
- 暑假集训日记--8.2--搜索
- STL 双向队列
- 暑假集训第三周STL L - Scavenger Hunt
- 数据结构实验之栈与队列四:括号匹配 sdut-oj
- XYNU—ACM暑假集训第四次测试 STL
- 暑假集训日记--8.10--二分+单调队列+练习赛
- STL常用容器总结——deque双向队列