这道题不是很难,难的是看不懂题目! (解析在下面)
题目描述 组队列是队列结构中一种常见的队列结构,在很多地方有着广泛应用。组队列是是指队列内的元素分组聚集在一起。组队列包含两种命令:
1、 ENQUEUE,表示当有新的元素进入队列,首先会检索是否有同一组的元素已经存在,如果有,则新元素排在同组的最后,如果没有则插入队列末尾。
2、 DEQUEUE,表示队列头元素出队
3、 STOP,停止操作
建议使用C++自带的队列对象queue,编程更方便
输入 第1行输入一个t(t<=10),表示1个队列中有多少个组
第2行输入一个第1组的元素个数和数值
第3行输入一个第2组的元素个数和数值
(注意:以上输入的组数据,只作为后续操作命令的分组依据,并非构建一条队列的指令。)
以此类推输入完t组以定义同组元素之后,开始输入多个操作命令(<200),对空的组队列进行操作,例如输入ENQUEUE 100,表示把元素100插入队列
输出 DEQUEUE出队的元素
样例输入 2 3 101 102 103 3 201 202 203 ENQUEUE 101 ENQUEUE 201 ENQUEUE 102 ENQUEUE 202 ENQUEUE 103 ENQUEUE 203 DEQUEUE DEQUEUE DEQUEUE STOP 样例输出 101 102 103
#include <iostream> #include <queue> #include <string> using namespace std; int find(int **arr,int t, int t1,int fin) { //查找元素在哪一个组 for(int i = 0; i < t; i++) for(int j = 0; j < t1; j++) if(arr[i][j] == fin) return i; //返回相应的组号 } int main() { int t, t1; cin>>t; queue<int> *que = new queue<int>[t + 3]; int **arr= new int*[t + 3]; int a = t, pos = 0; while(a--) { //创建二维动态数组 cin>>t1; arr[pos++] = new int[t1 + 3]; for(int i = 0; i < t1; i++){ cin>>arr[pos-1][i]; } } string str; vector<int> vec; //存放每一个小组的顺序 int index = 0, flag = 1; while(cin>>str) { if(str == "ENQUEUE") { int num; cin>>num; int fin = find(arr,t,t1,num); if(que[0].empty()) { //如果第一个队列为空,无条件入队 que[0].push(num); vec.push_back(fin); //第一个队列的组号为fin,相同组的元素都将存放在第一个队列 } else { for(int i = 0; i < vec.size(); i++) { int flag1 = 1; //辅助判断是否找到相同的队列 if(vec[i] == fin) { que[i].push(num); flag1 = 0; break; } if(flag1 && i == (vec.size() - 1)) { //如果在已知队列中找不到相同元素的队列,则放入下一个新队列 que[i+1].push(num); vec.push_back(fin); } } } } if(str == "DEQUEUE") { if(que[index].empty()) index++; cout<<que[index].front()<<endl; que[index].pop(); } if(str == "STOP") { break; } } for(int i; i < t + 3; i++) delete []arr[i]; delete []que; delete []arr; }题目的测试样例比较难懂,我们看这个测试样例就比较容易理解了; 3 3 101 102 103 3 201 202 203 3 301 302 303 ENQUEUE 201 ENQUEUE 301 ENQUEUE 102 ENQUEUE 101 ENQUEUE 203 ENQUEUE 302 DEQUEUE DEQUEUE DEQUEUE STOP 输出 201 203 301