栈、先进后出,后进先出,好像屯粮食的箱子。

总是操作最顶部的元素,时间复杂度 O(1),入栈时 先指针上移,然后压入数据(否则覆盖最上面元素值)。出栈时,先移除数据,再指针下移。

队列,先进先出,比如排队,队尾插入,对头排出。引申出循环队列。

队列的插入(入队)操作,是在队尾进行操作的,队列中的其他元素不用移动。入队操作的时间复杂度为O【1】.但是如果,是删除(出队)操作,需要在队头操作,需要移动队列中所有元素,以确保我们队头(下标为0的位置)不为空。所以,时间复杂度为O【n】。

iOS 设置队列优先级oc_出队

 

引入front、rear指针。front指向第一个元素的位置,rear指向最后一个元素的下一个位置。

这样,当rear=front时,不是队列中只有一个元素,而是队列为空。

这样我们在进行出队操作时,队列中其他元素就不用动了。我们的时间复杂度为o[1].

 

rear已经超出了数组的界限,但是下标为0、1的位置还是空的,这样是不是挺浪费的

iOS 设置队列优先级oc_存储单元_02

为了解决,所以出现了 循环队列。

iOS 设置队列优先级oc_出队_03

我们开始知道 如果 rear=front,此时队满。可是,我们刚才说rear=front时,队列为空。那么,rear=front时,是空还是满呢?对于这个问题,我们提供了2中解决方法。

方法一:初始化一个flag变量,当flag=1,rear==front时,队列满。当flag=0,rear==front时,队列空。

方法二:当rear==front时,队列为空。当rear与front中间仅差一个存储单元时,队列为满。

iOS 设置队列优先级oc_时间复杂度_04

front与rear之间相处一个存储单元,此时我们就说队列已满。因为rear有时>front,有时<front。我们假设队列的 最大尺寸为QueueSize,那么我们可以得到计算队列为满的公式。

(rear+1)%QueueSize==front.

当rear>front时,rear-front就是队列的长度。如下图:

iOS 设置队列优先级oc_时间复杂度_05

当rear<front时,此时的队列长度分两部分,一部分为QueueSize-front,另一部分为rear+0

iOS 设置队列优先级oc_iOS 设置队列优先级oc_06

将两部分加在一起,就是队列的长度。最后,我们得出计算队列长度的通用公式:

(rear-front+QueueSize)%QueueSize

 

 

优先级队列,有序排列,对头是最先处理的也就是排出,队尾是最后处理的,由于需要有序,所以插入的时候比较慢(并不是向普通对列一样使用移动指针的形式,而是直接移动元素位置),性能有限,但删除的时候效率很高,总是处理对头元素,然后对头指针下移,时间复杂度O(1)。