数据结构之队列及优先队列

队列

队列在外面生活中很常见,例如排队结账,付款等。那么我们不难发现,队列存在一种特性,就是先进先出(FIFO)。

常见函数

std::queue<int> Q;//代码中已经声明了队列

Q.push();//向队列队尾添加一个新的元素

Q.pop();//移除队列的第一个元素

Q.front();//返回队列中的第一个元素,通常和q.pop()一起用

Q.back();//返回队列最后一个元素

Q.empty();//检查队列是否为空

Q.size();//返回队列的元素的个数

优先队列

优先队列的本质是基于堆数据结构实现的。

std::priority_queue 是作为一个容器适配器提供的,它通常通过最大堆来实现。堆是一种特别的完全二叉树,它的每一个节点都满足堆性质——节点的键值总是不大于其父节点的键值(这称为最大堆)或不小于其父节点的键值(这称为最小堆)

优先队列保证了队列的第一个元素始终是最大的元素(或者是最小的,这取决于如何定义比较函数)。当需要快速访问最大元素,但不需要整个队列都是有序的时候,优先队列是非常有用的。

常见操作函数

Q.push();//向优先队列中添加元素。

Q.pop();//移除队列中最大的元素(位于队列的前端)。

Q.top();//访问队列中最大的元素,不移除它。

Q.empty();//检查队列是否为空。

Q.size();//返回队列中的元素数量。

注意哦,这里取头是q.top(),不是q.front();

在默认情况下 std::priority_queue 使用最大堆实现,使得最大的元素总是位于队列的前端。如果要改变,在简单的情况下使用 std::greater<T> 来实现最小堆,使得最小的元素位于前端,其中T是数据类型。

我们也可以通过提供自定义的比较函数来改变排序准则。以下是通过使用函数对象定义比较函数。

一般数据类型

#include <iostream>
#include <queue>

struct Compare {
    bool operator()(int a, int b) {
        return a > b;  // 队列头部是最小
    }
};

int main() {
    // 使用自定义比较器初始化优先队列,记得要在这里吧Compare类作为参数
    std::priority_queue<int, std::vector<int>, Compare> pq;

    // 向优先队列中添加元素
    pq.push(30);
    pq.push(20);
    pq.push(50);
    pq.push(40);

    // 依次取出元素,应该按从小到大的顺序输出
    while (!pq.empty()) {
        std::cout << pq.top() << " ";
        pq.pop();
    }

    return 0;
}

结构体数据类型

#include<bits/stdc++.h>
struct Employee {
    std::string name;
    int salary;
    
    //构造函数
    Employee(std::string n, int s) : name(n), salary(s) {}
};

struct CompareEmployee {
    bool operator()(const Employee& e1, const Employee& e2) {
        // 返回 true 如果 e1 的薪水小于 e2 的薪水
        return e1.salary < e2.salary;  // 高薪水优先
    }
};

int main() {
    // 创建优先队列,使用我们的比较函数
    std::priority_queue<Employee, std::vector<Employee>, CompareEmployee> pq;

    // 向优先队列添加员工
    pq.push(Employee("Alice", 50000));
    pq.push(Employee("Bob", 70000));
    pq.push(Employee("Charlie", 60000));

    // 输出队列中的员工,从薪水最高的开始
    while (!pq.empty()) {
        Employee e = pq.top();
        pq.pop();
        std::cout << e.name << " earns $" << e.salary << std::endl;
    }

    return 0;
}

 构造函数定义:

Employee(std::string n, int s) : name(n), salary(s) {}


这一行是 Employee 结构体的构造函数。构造函数是一个特殊的成员函数,当创建结构体或类的对象时会自动调用。

参数:构造函数接受两个参数string n 和 int s。

初始化列表语法 :

name(n), salary(s) 是初始化列表,name(n)表示用参数n的值来初始化成员name,salary(s)表示使用s来初始化成员变量salary。

题目列表

I-礼物商店_第二届“重科杯”重庆科技大学程序设计竞赛 (nowcoder.com)

竞赛中心 - 蓝桥云课 (lanqiao.cn)

4.生日的礼物 - 蓝桥云课 (lanqiao.cn)

题解 

优先队列的题解-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/gege_0606/article/details/139137821?spm=1001.2014.3001.5501

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值