数据结构篇-队列

队列这种数据结构,是一个等待处理的的行列,当我们希望按数据抵达的先后顺序处理数据的时候一般会用到,数据中最先放入的元素会被先取出,遵循先入先出的原则

 

《挑战程序设计竞赛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
*/

 

 

 

你可能感兴趣的:(算法与数据结构)