数据结构篇-队列

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

 

《挑战程序设计竞赛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<string.h>
#include<stdio.h>
#include<iostream>
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()在队列为空时返回trueO(1)
#include<string.h>
#include<stdio.h>
#include<queue>
#include<iostream>
using namespace std;
int main () {
    queue <string> 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<iostream>
#include<queue>
#include<algorithm>
#include<string>
using namespace std;
int main () {
    int n, q, t;
    string name;
    //使用标准库中的queue
    queue<pair<string, int>> Q;//任务的队列

    cin >> n >> q;
    //使用标准库中的queue
    for(int i = 0; i < n; i++) {
        cin >> name >> t;
        Q.push(make_pair(name, t));
    }
    pair<string, int> 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
*/

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值