• 队列queue和优先队列priority_queue


    转载链接:https://blog.csdn.net/zichen_ziqi/article/details/80819939

    https://www.cnblogs.com/QG-whz/p/5171123.html

    https://blog.csdn.net/zongyinhu/article/details/49801373

    https://www.cnblogs.com/DWVictor/p/9992792.html

    https://blog.csdn.net/weixin_36888577/article/details/79937886

    现在Acm在学stl容器了,但我还是有很多不懂吧,然后想接下来就隔断时间总结一些容器的使用,慢慢来掌握。(当然主要是搬运大佬的博客)

    今天就从队列开始了

    队列

    1、队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:

    (1)队列中的数据元素遵循“先进先出”(First In First Out)的原则;

    (2)在队尾添加元素,在队头删除元素。

    2、队列的相关概念:

    (1)队头与队尾: 允许元素插入的一端称为队尾,允许元素删除的一端称为队头;

    (2)入队:队列的插入操作;

    (3)出队:队列的删除操作。

    3、队列的操作:

    (1)入队: 通常命名为push()

    (2)出队: 通常命名为pop()

    (3)求队列中元素个数

    (4)判断队列是否为空

    (5)获取队首元素

    4、队列的分类:

    (1)基于数组的循环队列(循环队列)

    (2)基于链表的队列(链队列)

    5、实例分析

           C++队列queue模板类的定义在<queue>头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型。C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。

    q.empty()               如果队列为空返回true,否则返回false
    q.size()                返回队列中元素的个数
    q.pop()                 删除队列首元素但不返回其值
    q.front()               返回队首元素的值,但不删除该元素
    q.push()                在队尾压入新元素
    q.back()                返回队列尾元素的值,但不删除该元素

    优先队列

    优先队列:顾名思义,首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队~

    他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队

     优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的

    定义:priority_queue<Type, Container, Functional>
    Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆

    //升序队列
    priority_queue <int,vector<int>,greater<int> > q;
    //降序队列
    priority_queue <int,vector<int>,less<int> >q;
    
    //greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

    看例子

    #include<iostream>
    #include <queue>
    using namespace std;
    int main() 
    {
        //对于基础类型 默认是大顶堆
        priority_queue<int> a; 
        //等同于 priority_queue<int, vector<int>, less<int> > a;
        
        //             这里一定要有空格,不然成了右移运算符↓
        priority_queue<int, vector<int>, greater<int> > c;  //这样就是小顶堆
        priority_queue<string> b;
    
        for (int i = 0; i < 5; i++) 
        {
            a.push(i);
            c.push(i);
        }
        while (!a.empty()) 
        {
            cout << a.top() << ' ';
            a.pop();
        } 
        cout << endl;
    
        while (!c.empty()) 
        {
            cout << c.top() << ' ';
            c.pop();
        }
        cout << endl;
    
        b.push("abc");
        b.push("abcd");
        b.push("cbd");
        while (!b.empty()) 
        {
            cout << b.top() << ' ';
            b.pop();
        } 
        cout << endl;
        return 0;
    }

    输出

    4 3 2 1 0
    0 1 2 3 4
    cbd abcd abc
    就是出队按优先级出队
  • 相关阅读:
    怎么将java项目打包成双击就可以运行的jar包---fatjar
    hdu 2629 Identity Card (字符串解析模拟题)
    求最远点对,输出距离
    poj 2299 求逆序数
    第九周作业 实现图片压缩
    第八周作业 struts,spring,jpa整合简单测试
    第七周作业 POI操作Excel,world文档
    第七周作业 关于xml问题
    第六周作业 略谈jsp
    第六作业 持久层框架mybatis小记
  • 原文地址:https://www.cnblogs.com/zlszls3113373723/p/11824408.html
Copyright © 2020-2023  润新知