4月11日栈和队列

发布时间 2023-04-11 23:35:16作者: 玄灵镜

栈与队列与之前的类都有所不同,他们类似于一个适配器,他们的实现时给一个给定的表加一定的限制或属性使其成为队列或者栈,

可以看到他们里面的成员变量就是一个容器,而插入和删除也都是对里面容器的尾删和插入等,但是要注意的是因为顺序表效率原因不支持头插,所以队列的容器也不能支持vector类。

在queue文件中有一个特殊的容器叫deque他不仅支持头插也支持排序和随机访问,那为什么vector和list还没有被她所取代呢,因为他虽然具有顺序表和链表的优点但是他又不能“精通”这些优点,因为他在随机访问上效率不如顺序表,又在任意位置插入时将空间利用的像链表那样淋漓尽致,所以他是一个很鸡肋的存在。

那么他的底层是如何实现的呢?

他的实现有点类似于希尔排序的思想,既然顺序头插需要挪动很多,那么我不如直接又一个个链接起来的数组组成,插入时只需要增加一个小数组,而随机访问时可以用数组的下标访问,但是这样重载迭代器和{}运算符很麻烦,于是就导致了他性能居于顺序表和链表之间。

他的迭代器有四部分组成分别是小数组的头和尾以及当前节点和当前小数组指针,然后经过复杂的函数来实现迭代器。

最后就是优先级队列了,这个队列在入队列后进行出队列时会将设定好的优先级优先输出,比如设定大数为优先级,那么他出队列一定是队列中最大的。

比如下面这个题:

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

用优先级队列很容易解答,但是有一个缺点若是要处理的数据是海量数据那么,这样处理效率未免太低了,

我们可以用堆算法的思想去解决,建立一个有k个数的小堆,然后用优先级队列不断出堆和入堆,当处理完数据后堆里面就剩下最大的两个数了,此时再次出队列就能得到第k大的数,这样就可以避免不必要的排序资源浪费了