从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队列)的主要内容,如果未能解决你的问题,请参考以下文章