(本人写的第一篇博客,不喜勿喷>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