例如课室有8排,5个人要选择坐哪一排,如果
第一个人要坐第 2 排,
第二个人要坐第 3 排,
第三个人要坐第 1 排,
第四个人要坐第 2 排,
第五个人要坐第 1 排,
则第2排坐了第1,第4个人,第3排坐了第2个人,第1排坐了第3,第5个人,
那么这5个人组成的整个队列是这样子的:
1 4 2 3 5。
需要代码实现吗?
#include
#include
#include
using namespace std;
const int N = 1010;
const int M = 100100;
int head[N], tail[N], en;
int edge[M], nxt[M], pre[M];
int num[N], use[N], numh, numt;
class Queue
{
void add(int x, int y)
{
edge[en] = y;
nxt[en] = tail[x];
pre[nxt[en]] = en;
pre[en] = -1;
if (tail[x] == -1)
{
head[x] = en;
}
tail[x] = en++;
}
public:
Queue()
{
memset(tail, -1, sizeof tail);
memset(use, 0, sizeof use);
numh = numt = en = 0;
}
void EnQueue(int x, int group)
{
add(group, x);
if (!use[group])
{
use[group] = 1;
num[numt++] = group;
if (numt == N)
numt = 0;
}
}
int DeQueue()
{
if (head[num[numh]] == -1)
{
use[num[numh++]] = 0;
if (numh == N)
numh = 0;
}
int &i = head[num[numh]];
int res = edge[i];
i = pre[i];
return res;
}
bool empty()
{
return head[num[numh]] == -1 && (numh + 1) % N == numt;
}
};
int main()
{
Queue q;
q.EnQueue(1,2);
q.EnQueue(2,3);
q.EnQueue(3,1);
q.EnQueue(4,2);
q.EnQueue(5,1);
while(!q.empty())
cout<cout< return 0;
}
意思是同一个类别或者分组的元素必须挨着。