为了账号安全,请及时绑定邮箱和手机立即绑定

你好,可以帮我解释下这个程序是什么意思么?详细解释下。

你好,可以帮我解释下这个程序是什么意思么?详细解释下。

米脂 2022-06-10 11:07:56
#include <iostream>#include <string>#include <queue>#include <set>using namespace std;#define MaxLen 100int main(){set<int> group[MaxLen];queue<int> subgroupQueue[MaxLen];queue<queue<int>*> totalQueue; (这是什么意思?)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;cin>>s;while(s!="STOP"){if (s=="ENQUEUE"){cin>>current;for(int i=0;i<cases;i++){if (group[i].find(current)!=group[i].end()){if (subgroupQueue[i].empty()) totalQueue.push(&subgroupQueue[i]);subgroupQueue[i].push(current);}}}else{totalQueue.front()->pop();if (totalQueue.front()->empty()) totalQueue.pop();}cin>>s;}while(!totalQueue.empty()){cout<<totalQueue.front()->front();totalQueue.front()->pop();if (totalQueue.front()->empty())totalQueue.pop();if (!totalQueue.empty()) cout<<' ';}}
查看完整描述

2 回答

?
慕侠2389804

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<<' ';
}
}


查看完整回答
反对 回复 2022-06-14
?
九州编程

TA贡献1785条经验 获得超4个赞

queue<queue<int>*> totalQueue; (这是什么意思?)totalQueue是一个队列的指针,这个队列里放的每个元素也都是一个队列,这些队列里的元素是int型的

查看完整回答
反对 回复 2022-06-14
  • 2 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信