队列这种数据结构,是一个等待处理的的行列,当我们希望按数据抵达的先后顺序处理数据的时候一般会用到,数据中最先放入的元素会被先取出,遵循先入先出的原则
《挑战程序设计竞赛2》中的例题
模拟CPU循环调度处理任务
现在有名称为name(i)且处理时间为time(i)的n个任务按顺序排成一列,CPU通关循环调度法,逐一处理这些任务,每个任务最多处理q ms之后任务将被移动至队尾,CPU随即开始处理下一个任务
输入n q
接下来n行每行是 任务名 和 需要处理的时间
输出
按任务完成的先后顺序输出任务名以及结束时间
样例
input
5 100
p1 150
p2 80
p3 200
p4 350
p5 20
output
p2 180
p5 400
p1 450
p3 550
p4 800
思路:
队列Q,队首 整型指针head, 队尾 整型指针tail, 添加新元素x enqueue(x){然后tail++}, 取出元素dequeue(){然后head++}
思路很简单,代码有点长
#include
#include
#include
using namespace std;
#define len 100005
typedef struct pp {
char name[100];
int t;
} P;
P Q[len];
int head, tail, n;
void enqueue (P x) {
Q[tail] = x;
tail = (tail + 1) % len;
}
P dequeue () {
P x = Q[head];
head = (head + 1) % len;
return x;
}
int min (int a, int b) {
return a < b ? a : b;
}
int main() {
int elaps = 0, c;
int i, q;
P u;
cin >> n >> q;
for(i = 1; i <= n; i++) {
scanf("%s", Q[i].name);
cin >> Q[i].t;
}
head = 1;
tail = n + 1;
while( head != tail) {
u = dequeue();
c = min(q, u.t);
u.t -= c;
elaps += c;
if(u.t > 0)
enqueue(u);
else
printf("%s %d\n", u.name, elaps);
}
return 0;
}
/*
5 100
p1 150
p2 80
p3 200
p4 350
p5 20
*/
解之前,先看一下表
函数名 | 功能 | 复杂度 |
size() | 返回队列的元素数 | O(1) |
front() | 返回队首元素 | O(1) |
pop() | 从队列中取出并删除元素 | O(1) |
push() | 向队列中添加元素 | O(1) |
empty() | 在队列为空时返回true | O(1) |
#include
#include
#include
#include
using namespace std;
int main () {
queue Q;
Q.push("a");//a
Q.push("b");//ab
Q.push("c");//abc
Q.push("d");//abcd
cout << Q.front() << " ";//a
Q.pop();//bcd;
cout << Q.front() << " ";//b
Q.pop();//cd;
cout << Q.front() << " ";//c
Q.pop();//d;
return 0;
}
现在用queue成员函数来解循环调度
#include
#include
#include
#include
using namespace std;
int main () {
int n, q, t;
string name;
//使用标准库中的queue
queue> Q;//任务的队列
cin >> n >> q;
//使用标准库中的queue
for(int i = 0; i < n; i++) {
cin >> name >> t;
Q.push(make_pair(name, t));
}
pair u;
int elaps = 0, a;
//模拟
while( !Q.empty()) {
u = Q.front();
Q.pop();
a = min(u.second, q);//执行时间片q或所需时间u, t的处理
u.second -= a;//计算剩余时间
elaps += a;//累计已经经过的时间
if(u.second > 0) {
Q.push(u);//如果处理尚未结束则重新添加至队列
}
else {
cout << u.first << " " << elaps << endl;
}
}
return 0;
}
/*
5 100
p1 150
p2 80
p3 200
p4 350
p5 20
*/