C实现环形数组队列和queue一些区别小记

网上看到一个很棒的环形数组队列实现方法,转载过来。
原网址: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()

具体可参考优先队列 priority_queue 详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值