【科普·给学弟看的算法】队列的基础知识和基本运用(1):基本队列与优先队列

来源:互联网 发布:变频布林线源码 编辑:程序博客网 时间:2024/06/05 22:40

(本人写的第一篇博客,不喜勿喷>w<)

数据结构是学习编程中一个很重要的知识块,今天我来介绍下数据结构中最简(坑)(爹)队列(queue)

队列拥有一个基本特性,就是“FIFO(First In First Out,先进先出)”

什么叫做“先进先出”呢?

举个栗子:

如图,是一个餐馆。大家正在排队领餐。先排队的人就先拿到饭,先拿到饭的人就先离开队伍。这就是“先进先出”。


接下来来介绍一下:入队操作

先来科普一下:什么是入队操作?

入队操作就是向队伍里加入元素的操作就是入队操作。

怎么完成?

我们用两个指针:头指针(head)和尾指针(tail)来维护头尾。

尾指针总是指向队尾的元素。当每次入队时,就把尾指针指向刚刚入队的元素。


听不懂?

依旧举个栗子:

目前,餐馆里只有一个人:
这个时候,尾指针就指向最后一个人,也就是第一个人,故头尾指针都为1.

然后,第二个人粗线了:
根据《排队基本法》,新来的人必须排在队伍的最后(否则会被爆K一顿)所以这个时候尾指针就指向2,头指针不变,依旧是1。

就这样,越来越多的人(N个)挤进餐馆(世界上就这一家)2头指针依旧指向1,而尾指针就指向了N+2。



就这样,入队操作就完成了。

写成代码很简单:

先初始化:

head = tail = 0
然后是入队操作(就一行=_=b,很简单的...)
Q[tail++] = a
(还有c++的STL更劲爆!在本文末会介绍到。)


入队介绍完了,我们继续介绍出队操作

出队是怎么一回事呢?

排队的人们拿完饭就可以离开队伍去吃饭了。这个操作就是出队

怎么完成?

因为队列是先进先出,所以说出队时应该是弹出队首(即头指针指的方向)

所以我们只要弹出头指针指的位置就可以了

依旧举栗子

让我们请出刚才排队等饭的苦逼人们
现在第一个人的饭已经好了(某人:明明是面!)然后他离开了这个队伍

现在是这样的

目前在队头的人已经离开了,所以说头指针目前指向的是2
(图上口胡的别管)

如果不断地离队下去,头指针就会不断地向后移,而尾指针不会变。

写成代码就是这样的(依旧只有一行.....):

return Q[head++]
当队列没有人的时候,则队列为空(empty),判断队列为空的方法很简单:

当头指针等于尾指针时,队列为空

写成代码,依旧一行:

if(tail == head) return 1/*return 1表示队列为空*/

那么,队列的全部操作写成代码如下:

int q[23333],head = 1,tail = 1;/*判断队列是否为空*/bool IsEmpty(){   if(tail == head) return 1;}/*入队*/void push(int a){    q[tail++] = a;}/*弹出队首元素*/int front(){    return q[head++];}

但是这样有一个问题:会造成假溢出

为什么呢?因为头指针在不断地向后移,尾指针也不断的向后移,浪费了大量的空间,导致溢出

怎么办?每当删去一个队头元素,则可依次移动队列中的元素总是使头指针指向队列中的第一个位置。

写成代码是这样的(改进后的出队操作):

int front(){    int p = q[head];    for(i=2;i<=n;i++){        q[i-1] = q[i];    }    return p;}
关于基础队列的知识就说到这里。

接下来来讲讲神奇的C++ S(水)T(桶)L(楼)

#include <queue> /*就是这货*/
基本定义:

queue <int> Q;

这个STL的常用操作有以下几个:

1.入队:

/*元素a入队*/Q.push(a);
2.出队(弹出队首元素):
/*弹出队首元素*/int a = Q.front();/*出队*/Q.pop
3.判断队内是否为空

/*返回1为空,返回0为非空*/return Q.empty()

然后来介绍一下STL里面最为良(丧)(病)的东西:优先队列!

定义:

priority_queue <int> Q

这货的特性是:元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出

(largest-in,first-out)的行为特征。

也就是说,每当你元素入队时,就像进行了一次高效的插入排序,元素默认是升序排列的。

就像你排队的时候,如果大喊一声:“我爸是李白(Gang)!”就可以站到队伍最前面一样=_=b



那么关于队列的事就讲到这里~

大家再见~

白白~( ^_^ )/~~


现在

什么叫做先机

单qwq

2 0
原创粉丝点击