2 回答
TA贡献1719条经验 获得超6个赞
本程序实现多队列操作。
数据结构:
// cases个group,每个group[i]是一个数集
set<int> group[MaxLen];
// cases个队列,subgroupQueue[i]对应于上面的group[i]
queue<int> subgroupQueue[MaxLen];
// 队列的队列,每个元素是一个队列指针
queue<queue<int>*> totalQueue;
初始值:
cases和group[MaxLen]中的值由终端输入;所有队列(包括subgroupQueue[k]和totalQueue初始为空。
操作:
1. ENQUEUE x
依次检查各个group[i],若x是group[i]中的元素,则将x加入对应队列subgroupQueue[i];同时若subgroupQueue[i]原先为空,则将subgroupQueue[i]的指针加入队列totalQueue。这样totalQueue中包含了所有到目前为止非空的subgroupQueue[i](以队列第一个元素插入的时间为序)
2. DEQUEUE
从totalQueue队首的那个队列的首部删除一个元素;若删除后队列为空,则将这个队列也从totalQueue队首删除。
3. STOP
结束操作,打印队列中的所有元素。(从totalQueue中依次取出所有subgroupQueue队列,依次取出该队列的所有元素并打印)
程序:
#include <iostream>
#include <string>
#include <queue>
#include <set>
using namespace std;
#define MaxLen 100
int main(){
set<int> group[MaxLen];
queue<int> subgroupQueue[MaxLen];
queue<queue<int>*> totalQueue;
// 1. 由终端输入并建立集合组group[cases]
int cases;
cin>>cases;
for(int i=0;i<cases;i++){
int setNum;
cin>>setNum;
for(int j=0;j<setNum;j++){
int temp;
cin>>temp;
group[i].insert(temp);
}
}
string s;
int current;
// 2. 输入并处理操作指令,直至收到STOP指令
cin>>s;
while(s!="STOP"){
if (s=="ENQUEUE"){
// 2.1 ENQUEUE
cin>>current;
for(int i=0;i<cases;i++){
if (group[i].find(current)!=group[i].end()){ // current在group[i]中
if (subgroupQueue[i].empty()) totalQueue.push(&subgroupQueue[i]); // 将subgroupQueue[i]加入totalQueue
subgroupQueue[i].push(current); // 将current加入subgroupQueue[i]
}
}
}else{
// 2.1 DEQUEUE
totalQueue.front()->pop(); // 从第一个队列dequeue
if (totalQueue.front()->empty()) totalQueue.pop(); // 从totalQueue中删除空队列
}
cin>>s;
}
// 3. 依次输出所有队列中的所有元素
while(!totalQueue.empty()){
cout<<totalQueue.front()->front(); // 输出第一个队列的队首元素
totalQueue.front()->pop(); // 删除第一个队列的队首元素
if (totalQueue.front()->empty())totalQueue.pop(); // 若第一个队列为空,则从totalQueue中删除,继续处理下一个队列
if (!totalQueue.empty()) cout<<' ';
}
}
TA贡献1785条经验 获得超4个赞
queue<queue<int>*> totalQueue; (这是什么意思?)totalQueue是一个队列的指针,这个队列里放的每个元素也都是一个队列,这些队列里的元素是int型的
添加回答
举报