什么是堆?

堆是一种数据结构,可以用来实现优先队列

大根堆

大根堆,顾名思义就是根节点最大。我们先用小根堆的建堆过程学习堆的思想。

小根堆

下图为小根堆建堆过程

堆的操作

  • 上浮
  • 下沉
  • 插入
  • 弹出
  • 取顶
  • 堆排序

STL heap

所在库 #include

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
vector<int> a;
int num,n=10;
for(int i=0;i<n;i++)
{
num = rand()%(233*2);
a.push_back(num);
} for(vector<int>::iterator i=a.begin();i!=a.end();i++)
{
cout<<*i<<ends;
}cout<<endl<<endl; make_heap(a.begin(),a.end());//默认的大根堆
for(vector<int>::iterator i=a.begin();i!=a.end();i++)
{
cout<<*i<<ends;
}cout<<endl<<endl; make_heap(a.begin(),a.end(),cmp);//自制的小根堆
for(vector<int>::iterator i=a.begin();i!=a.end();i++)
{
cout<<*i<<ends;
}cout<<endl<<endl; a.push_back(2333);
push_heap(a.begin(),a.end(),cmp);//将新加的元素加入堆中
for(vector<int>::iterator i=a.begin();i!=a.end();i++)
{
cout<<*i<<ends;
}cout<<endl<<endl; a.pop_back(); //删除尾部
for(vector<int>::iterator i=a.begin();i!=a.end();i++)
{
cout<<*i<<ends;
}cout<<endl<<endl; getchar();getchar();getchar();getchar();
return 0;
}

STL queue

所在库#include

#include<bits/stdc++.h>
using namespace std; struct student{
int grade;
string name;
};
struct cmp{
bool operator() (student s1,student s2){
return s1.grade < s2.grade;
}
}; int main(int argc, char const *argv[])
{
int n=10,num;
/*
1. push 【入队插到队尾】
2. pop 【队首元素出队】
3. size 【返回队列中元素的个数】
4. front 【返回队列中第一个元素】
5. back 【返回队列中最后一个元素】
6. empty 【判断队列是否为空】
*/
//cout<<"队列:"<<endl;
queue<int> a;
for(int i=1;i<n;i++){
num = rand()%233;
a.push(num);
}
//数列长度
cout<<a.size()<<endl;
//数列头元素
cout<<a.front()<<endl;
//数列尾元素
cout<<a.back()<<endl;
//数列是否为空
while(!a.empty()){
cout<<a.front()<<ends;
a.pop();
}cout<<endl<<endl; priority_queue<int> pq_1;
for(int i=1;i<n;i++){
num = rand()%233;
pq_1.push(num);
}
//默认情况下,数值大的在队首位置(降序)
while(!pq_1.empty()){
//注意这里的访问头元素为.top
cout<<pq_1.top()<<ends;
pq_1.pop();
}cout<<endl; //以下情况下,数值小的在队首位置(升序)
priority_queue<int,vector<int>,greater<int> > pq_2;
for(int i=1;i<n;i++){
num = rand()%233;
pq_2.push(num);
} while(!pq_2.empty()){
//注意这里的访问头元素为.top
cout<<pq_2.top()<<ends;
pq_2.pop();
}cout<<endl;cout<<endl; //运算符重载 priority_queue<student,vector<student>,cmp> q;
student s1,s2,s3;
s1.grade = 90;
s1.name = "Tom"; s2.grade = 80;
s2.name = "Jerry"; s3.grade = 100;
s3.name = "Kevin"; q.push(s1);
q.push(s2);
q.push(s3); while(!q.empty()){
cout<<q.top().name<<":"<<q.top().grade<<endl;
q.pop();
}
getchar();
return 0;
}

数据结构&堆&heap&priority_queue&实现的更多相关文章

  1. 数据结构 - 堆(Heap)

    数据结构 - 堆(Heap) 1.堆的定义 堆的形式满足完全二叉树的定义: 若 i < ceil(n/2) ,则节点i为分支节点,否则为叶子节点 叶子节点只可能在最大的两层出现,而最大层次上的叶 ...

  2. 基本数据结构——堆(Heap)的基本概念及其操作

    基本数据结构――堆的基本概念及其操作 小广告:福建安溪一中在线评测系统 Online Judge 在我刚听到堆这个名词的时候,我认为它是一堆东西的集合... 但其实吧它是利用完全二叉树的结构来维护一组 ...

  3. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  4. python数据结构之堆(heap)

    本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...

  5. 堆heap和栈Stack(百科)

    堆heap和栈Stack 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈 ...

  6. Java中堆(heap)和栈(stack)的区别

    简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分 ...

  7. 数据结构-堆 Java实现

    数据结构-堆 Java实现. 实现堆自动增长 /** * 数据结构-堆. 自动增长 * */ public class Heap<T extends Comparable> { priva ...

  8. 纸上谈兵: 堆 (heap)

    纸上谈兵: 堆 (heap)   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 堆(heap)又被为优先队列(priority ...

  9. C 数据结构堆

    引言 - 数据结构堆 堆结构都很耳熟, 从堆排序到优先级队列, 我们总会看见它的身影. 相关的资料太多了, 堆 - https://zh.wikipedia.org/wiki/%E5%A0%86%E7 ...

随机推荐

  1. 谈谈CSS的浮动问题

    浮动的工作原理 浮动元素脱离文档流,不占据空间.浮动元素碰到包含它的边框或者浮动元素的边框则停留. 浮动元素可能引起的问题 1.父元素的高度无法被撑开,影响与父级元素同级的元素 2.与浮动元素同级的非 ...

  2. DataTable的Ajax使用

    DataTable Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 官网: https://datatables.net/ 中文网: ...

  3. 微信小程序动态生成保存二维码

    起源:最近小程序需要涉及到一些推广方面的功能,所以要写一个动态生成二维码用户进行下载分享,写完之后受益良多,特此来分享一下: 一.微信小程序动态生成保存二维码 wxml: <view class ...

  4. Node.js数据流Stream之Duplex流和Transform流

    Duplex流一个很好的例子是TCP套接字连接.需要实现_read(size)和_Write(data,encoding,callback)方法. var stream = require('stre ...

  5. .Net4.5新特性:正则表达式超时介绍

    “Regex” 在数据验证方面最受欢迎.考虑到您可能对“Regex”完全陌生的.请参考我介绍Regex如何运作的视频. But because of the typical parsing logic ...

  6. Firebird reset SYSDBA password

    Firebird 重置超级管理员SYSDBA密码 首先登陆到服务器上(以下以Windows系统演示),命令行进入安装目录,我这里是 D:\-Installer\-Firebird\Firebird-3 ...

  7. 在C#使用文件监控对象FileSystemWatcher 实现数据同步

    最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容.首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给WEB服务 ...

  8. DotNet Core 2.0部署后外网IP访问

    将DotNet Core2.0项目部署在Ubuntu上并且运行后,可以用localhost:5000来访问. 但是如果这时候用外网来访问就不行了. 这时候就有两种解决方案,第一种是用Nginx做代理实 ...

  9. layout_weight使用

    layout_weight的真正含义是等比例分割剩余空间, 在线性布局(linearlayout)中对宽度和高度进行比例分割, 三个子linearlayout分割父linearlayout高度,代码如 ...

  10. Java虚拟机基础知识你知道多少?

    http://www.cnblogs.com/qlky/p/7401841.html java虚拟机结构 http://liuwangshu.cn/java/jvm/1-runtime-data-ar ...