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隊列,依次取出該隊列的所有元素并打?。?br/>
程序:
#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型的
添加回答
舉報