网上看到一个很棒的环形数组队列实现方法,转载过来。
原网址:https://blog.csdn.net/xuanwolanxue/article/details/68925446
话不多说,上重点:
这里主要指的是队列的入队(enqueue)与出队(dequeue),对于链式队列来说,其入队和出队也就是链表的尾部插入与移除头部节点,这里就不多说,主要说一下以数组实现的循环链表的具体实现(其中head和tail都是表示数组的下标)。
入队: 如上面的循环队列示意图,入队操作,需要先判断tail节点的下一个位置是否是head,如果是就表示队列已满,无法入队,如果不是,那就可以入队,也即是将元素放入tail的下一个位置,最后将tail加一(也就是指向最终的尾元素),其伪代码如下:
/** 取余保证,当tail = size - 1 时,转回到0 */
int tail = (queue->tail + 1) % queue->size;
if (tail != queue->head)
{ /** 此处这样写,是因为正常情况下,非满的情况多于满了的情况,这样写可以稍微的加快点执行速度 */
queue->elems[queue->tail] = elem;
queue->tail = tail;
}
else /** 此时队列已满 */
{
printf("the queue is full!");
}
出队: 先判断 tail 和head是否相等,如果相等,就比较队列已空,无元素可出,不等则表示非空。此时需要取出head对于位置的元素,然后将head加1(当然,为了能够在head 增加到数组尾部时能够转回到首部,那么这里其实需要 将head加1与队列的size取余再赋值给head),其伪代码如下:
elem_type elem = elem_null; /** 初始化元素 */
if(queue->tail != queue->head) /** 判断队列不为空 */
{/**这样写的作用与上一段伪代码的作用是一样的 */
elem = queue->elems[queue->head];
/** 取余保证,当head= size - 1 时,转回到0 */
queue->head = (queue->head+1) % queue->size;
}
else /** 此时队列已空 */
{
printf("the queue is empty \n");
}
return elem;
STL 之queue、deque、priority_queue
queue不支持随机访问,即不能像数组一样地任意取值。并且,queue并不支持全部的vector的内置函数。比如queue不可以用clear()函数清空,清空queue必须一个一个弹出。同样,queue也并不支持遍历,无论是数组型遍历还是迭代器型遍历统统不支持,所以没有begin(),end();函数。
queue<int>q; 创建一个int型空队列q
q.empty(); 判断队列是否为空,为空返回true
q.push(s); 将变量s从队尾入队
q.pop(); 将队头元素弹出,队列中不再有该元素
q.front(); 只返回队头元素,只是查看,队列中元素依然存在
q.back(); 只返回队尾元素
q.size(); 返回队列中元素个数
deque:双端队列,可在队头队尾进行出队入队操作,支持[]操作符,也就是支持随即存取。
deque<int> dq; 创建一个数双端队列dq
dq.empty(); 判断队列是否为空,为空返回true
dq.push_front(s); 将s从队头入队
dq.push_back(s); 将s从队尾入队,和普通队列方式一样
dq.front(); 只返回队头元素
dq.back(); 只返回队尾元素
dq.pop_front(); 将队头元素弹出
dq.pop_back; 将队尾元素弹出
dq.clear(); 将队列清空
优先队列容器priority_queue与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。这点类似于给队列里的元素进行了由大互小的顺序排序。元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规则。
priority_queue <node> q;
priority_queue <int,vector<int>,less<int> > p;//less是从大到小
priority_queue <int,vector<int>,greater<int> > q;//greater是从小到大
q.size();//返回q里元素个数
q.empty();//返回q是否为空,空则返回1,否则返回0
q.push(k);//在q的末尾插入k
q.pop();//删掉q的第一个元素
q.top();//返回q的第一个元素
注意:没有back()