队列是一种特殊的表,只在表首进行删除,只在表尾进行插入,按照先进先出原则操作(First In First Out),又称为FIFO表;

队列的指针实现代码:

#include<cstdio>
#include<cstdlib>
#include<algorithm>
typedef struct node* link;
typedef struct node
{
int element;
link next;
}Node;
typedef struct aque* Queue;
typedef struct aque
{
link front; //队首节点指针
link last; //队尾节点指针
}Aque; Queue QueueInit(Queue Q)
{
Q->front=Q->last=0;
return Q;
}
int QueueEmpty(Queue Q)
{
return Q->front==0;
}
int QueueFull(Queue Q)
{
//这里个人认为通过指针实现的队列(在现阶段我的使用中)可以不需要判断队列空间是否已满;
}
int QueueFirst(Queue Q)
{
return Q->front->element;
}
int QueueLast(Queue Q)
{
return Q->last->element;
}
void EnterQueue(int x,Queue Q)
{
link p;
p=new Node; //创建一个新的节点
p->element=x;p->next=0;
if(Q->front) //如果队列非空
{
Q->last->next=p;
}
else Q->front=p; //空队列
Q->last=p;
}
int DeleteQueue(Queue Q)
{
link p;
int x=Q->front->element;
p=Q->front;
Q->front=Q->front->next;
free(p);
return x;
}
int main()
{
int i,j,k;
Queue Q=new Aque;
QueueInit(Q);
EnterQueue(5,Q);
EnterQueue(2,Q);
printf("%d",QueueFirst(Q));
DeleteQueue(Q);
EnterQueue(0,Q);
while(QueueEmpty(Q)!=1)
{
printf("%d",QueueFirst(Q));
DeleteQueue(Q);
}
return 0;
}

用循环数组实现队列代码:

循环数组的形状如下:

#include<cstdio>
#include<cstdlib>
#include<malloc.h>
typedef struct aque* Queue;
typedef struct aque
{
int maxsize;
int front; //队头游标
int last; //队尾游标
int* queue;
}Aque;
Queue QueueInit(int size,Queue Q)
{
Q->queue=(int*)malloc(size*sizeof(int));
Q->maxsize=size;
Q->front=Q->last=0;
return Q;
}
int QueueEmpty(Queue Q)
{
return Q->front==Q->last; //如果此时队列是空的,那么front和last游标在同一个位置 ;
}
int QueueFull(Queue Q)
{
return (((Q->last+1)%Q->maxsize==Q->front)?1:0); //如果此时队列是满的那么front和last是游标相邻的;
}
int QueueFirst(Queue Q)
{
return Q->queue[(Q->front+1)%Q->maxsize];
}
int QueueLast(Queue Q)
{
return Q->queue[Q->last];
}
void EnterQueue(int x,Queue Q)
{
Q->last=(Q->last+1)%Q->maxsize;
Q->queue[Q->last]=x;
}
int DeleteQueue(Queue Q)
{
Q->front=(Q->front+1)%Q->maxsize;
return Q->queue[Q->front];
}
int main()
{
int i,j,n;
scanf("%d",&n);
Queue Q=new Aque;
QueueInit(n,Q);
EnterQueue(5,Q);
EnterQueue(2,Q);
printf("%d",DeleteQueue(Q));
EnterQueue(0,Q);
while(QueueEmpty(Q)!=1)
{
printf("%d",QueueFirst(Q));
DeleteQueue(Q);
}
return 0;
}

思想:通过游标指向的变化,来判断队列是否已经满或者空;

栈在STL中有直接的函数可以使用,队列也是一样的,需要包括的文件时queue;

STL中队列使用代码:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<queue>
using namespace std;
queue<int> q;
int main()
{
int i,j,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
int tmp;
scanf("%d",&tmp);
q.push(tmp);
}
printf("%d",q.front());
q.pop();
while(q.empty()!=1)
{
printf("%d",q.front());
q.pop();
}
return 0;
}

第四次作业:

1、(计算一个数列中长度不超过k的数字之和的最大值):这种数列中某个长度对数字的操作,一般可以通过单调队列写;单调队列(最大值队列)思想是:只需要维护一个递减的数组,每次要输入到维护中的数如果比数组中最后的数小,直接加入,否则,数组中的数一定不是结果,则将其替换成要输入的这个数;具体理解可以看之前的一篇博客,里面也有单调队列相关的例题及代码;

这题先对数列求其前缀和(每个数其前面所有数的和),通过一个que数组存储sum的下标,维护这个que数组使之存储的下标其sum数组值中是一个递增的序列(因为通过每次存储比之更大的,就已经对所有的更大的sum都做了一个if判断,储存了其中的max);

代码:

#include<stdio.h>
#include<iostream>
using namespace std; const int Len = 100000 + 5;
int a[Len], que[Len], top, tail;
int main() {
int n, k, ans = -100000000, l, r, i;
cin >> n >> k;
que[top++] = 0; l = 1; r = 1;
for (i = 1; i <= n; i++)
{
cin >> a[i];
a[i] += a[i - 1];
while (top>tail&&i - que[tail]>k)tail++;
if (ans<a[i] - a[que[tail]])
{
ans = a[i] - a[que[tail]];
l = que[tail] + 1; r = i;
}
while (top>tail&&a[que[top - 1]]>a[i]) {top--;}
que[top++] = i;
}
printf("%d %d %d\n", ans, l, r);
}

第二题:(队列的基础运算用法):直接用一个队列将数字存储,然后按照题面意思对队列做删除等操作,就可以解出来;

ADT队列/FIFO表的更多相关文章

  1. 确定比赛名次(map+邻接表 邻接表 拓扑结构 队列+邻接表)

    确定比赛名次 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  2. P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表

    P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表 题目背景 \(JYY\) 和 \(CX\) 的结婚纪念日即将到来,\(JYY\) 来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店 ...

  3. JavaScript中的算法之美——栈、队列、表

    序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...

  4. POJ1821 单调队列//ST表 优化dp

    http://poj.org/problem?id=1821 当我们在考虑内层循环j以及决策k的时候,我们可以把外层变量i看作定值,以此来优化dp状态转移方程. 题意 有n个工人准备铺m个连续的墙,每 ...

  5. HDU 4123 Bob's Race:树的直径 + 单调队列 + st表

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 题意: 给你一棵树,n个节点,每条边有长度. 然后有m个询问,每个询问给定一个q值. 设dis[ ...

  6. 栈 队列 hash表 堆 算法模板和相关题目

    什么是栈(Stack)? 栈(stack)是一种采用后进先出(LIFO,last in first out)策略的抽象数据结构.比如物流装车,后装的货物先卸,先转的货物后卸.栈在数据结构中的地位很重要 ...

  7. 数据结构系列文章之队列 FIFO

    转载自https://mp.weixin.qq.com/s/ILgdI7JUBsiATFICyyDQ9w Osprey  鱼鹰谈单片机 3月2日 预计阅读时间: 6 分钟 这里的 FIFO 是先入先出 ...

  8. Luogu P1198 [JSOI2008]最大数 单调队列/ST表

    开一个单调队列,下标递增,值递减. 然后在上面二分最大数. 如果加上并查集可以做到接近线性. 还有一种是插入一个数然后,从后向前更新ST表. #include<cstdio> #inclu ...

  9. Codevs 4373 窗口(线段树 单调队列 st表)

    4373 窗口 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只 ...

随机推荐

  1. lua表类型

    Lua的表的定义: typedef struct Table { CommonHeader; lu_byte flags; lu_byte lsizenode; /* log2 of size of ...

  2. JS window.onload 和模拟document.ready.

    hhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhh ttttttttttttt 注意观察 事件执行的 先后顺序. 总的来说,window.onload()方法是必须等到页面内包括图片的 ...

  3. mfc 形式参数初始化

    初始化函数形参 int add(int a,int b) { return a+b; } add(,); ,,char*s=NULL) { printf("a=%d,b=%d,c=%d\n& ...

  4. 【BZOJ1018】[SHOI2008]堵塞的交通

    [BZOJ1018][SHOI2008]堵塞的交通 题面 bzoj 洛谷 洛谷 题解 菊队讲要用线段树维护连通性,但是好像没人写 解法一 将所有的加边删边离线,然后以最近删除时间为边权,$LCT$维护 ...

  5. [HNOI2015]开店 树链剖分,主席树

    [HNOI2015]开店 LG传送门 蒟蒻表示不会动态淀粉质. 先把点按年龄排序, 设\(dis[i]\)表示\(i\)到根的距离. 把我们要算的东西稍微变下形:\(ans\) \[ = \sum \ ...

  6. Form,选择并转移导航菜单

    1.代码实例 <!DOCTYPE html> <html> <head> <title>选择并转移导航菜单</title> <meta ...

  7. 基于Cocos2d-x-1.0.1的飞机大战游戏迁移到Cocos2d-x-3.0版本,并移植到Android平台成功运行

    一.版本迁移中的问题 1.游戏元素Sprite.Label.Action等等的创建函数名都改为create. 2.函数的回调callfunc_selectorcallfuncN_selectorcal ...

  8. csb反编译为csd,并自动进行资源的删除

    好多人都想将csb进行反编译为csd,然后进行资源的清理 目前自己的项目也遇到了类似的问题,所以进行了整理 还有很多不完善的地方,后续会一步步加深 请大家多多指教 下载链接:https://pan.b ...

  9. 关于matlab向文件写入数据的方法——留着备用

    MATLAB数据采集的时候,往往需要把得到的数据保存下来. fid = fopen(文件名,‘打开方式’): 说明:fid用于存储文件句柄值,如果fid>0,这说明文件打开成功.打开方式有如下选 ...

  10. 2018.4.23 linux系统

    linux: 1.代表linux的内核 2.代表linux的操作系统:linux的内核和工具软件.应用软件..办公工具.开发工具. 它的特点: 1.它是开源软件,时当今最成功的开源软件之一.所以很多的 ...