从0开始学算法--数据结构(2.3队列)

Posted wz-archer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从0开始学算法--数据结构(2.3队列)相关的知识,希望对你有一定的参考价值。

顾名思义:队列就像排序一样,先排队的人先得到处理

队列与栈类似:队列是一个先进先出表

首先考虑数组模拟,如果线性数组模拟,会导致占用空间过多,为什么?数组模拟栈会遇到这样的问题吗?

因为队列是一个先进先出表,比如加入5个元素占用的是数组下表的0-4号位置,这时候删除两个元素,0-1号位置。为了维护这个队列的结构就会导致0-1号位置占用但不利用。

栈取出的是数组尾部的元素,所以不会占用额外的空间。

优化:“将数组变为环形”(模的意义)。

如果我们每次加入元素是给数组下表取模,那么整个数组就变成了环状的,就不存在占用额外空间的问题了

例一:数组模拟循环调度算法

5个任务,每次执行一个任务最多100分钟,如果没有执行完将它放入队尾,如果执行完输出执行完毕的时间

0:150-80-200-350-20

1:80-200-350-20-50

2;200-350-20-50   输出180

3:。。。。。。。

输出:

5 100

p1 150

p2 80

p3 200

p4 350

p5 20

输出:

p2 180

p5 400

p1 450

p3 550

p4 800

代码:

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<fstream>
#include<cstring>
#include<bitset>
#include<cstdio>
#include<time.h>
#include<deque>
#include<queue>
#include<stack>
#include<cmath>
#include<map>
#include<set>

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 main(){
    int elaps=0,c;
    int i,q;
    P u;
    scanf("%d%d",&n,&q);
    
    for(int i=0;i<n;i++){
        scanf("%s",Q[i].name);
        scanf("%d",&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
",u.name,elaps);
        }
    }
    return 0;
}

c++标准库

头文件

#include<queue>

定义

queue<int>que;

将元素x加到队尾

que.push(x);

删除队头元素

que.pop();

访问队头元素但不删除

que.front();

例二:队列也可以解决广度优先搜索问题

给你n和m和三个操作,给n+1,-1,*2,问最少几次操作可以得到m

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<fstream>
#include<cstring>
#include<bitset>
#include<cstdio>
#include<time.h>
#include<deque>
#include<queue>
#include<stack>
#include<cmath>
#include<map>
#include<set>

using namespace std;

struct aa{
    int x,i;
};

int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    queue<aa>que;
    aa a;
    a.i=0;
    a.x=n;
    que.push(a);
    int num;
    while(!que.empty()){
        a=que.front();
        if(a.x==m){
            num=a.i;
            break;
        }
        //+
        a=que.front();
        a.x++;
        a.i++;
        que.push(a);
        //-
        a=que.front();
        a.x--;
        a.i++;
        que.push(a);
        //*
        a=que.front();
        a.x*=2;
        a.i++;
        que.push(a);
        
        que.pop();
    }
    printf("%d
",num);
    return 0;
}

 

以上是关于从0开始学算法--数据结构(2.3队列)的主要内容,如果未能解决你的问题,请参考以下文章

一起学数据结构与算法深度学习队列

原创《从0开始学RocketMQ》—单机搭建

片段(Java) | 机试题+算法思路+考点+代码解析 2023

Go语言核心36讲

从0开始学算法--排序(1.2冒泡排序)

从0开始学算法--排序(1.5归并排序)