什么是堆?

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

大根堆

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

小根堆

下图为小根堆建堆过程

堆的操作

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

STL heap

所在库 #include

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<vector>
  5. using namespace std;
  6. bool cmp(int x,int y)
  7. {
  8. return x>y;
  9. }
  10. int main()
  11. {
  12. vector<int> a;
  13. int num,n=10;
  14. for(int i=0;i<n;i++)
  15. {
  16. num = rand()%(233*2);
  17. a.push_back(num);
  18. }
  19. for(vector<int>::iterator i=a.begin();i!=a.end();i++)
  20. {
  21. cout<<*i<<ends;
  22. }cout<<endl<<endl;
  23. make_heap(a.begin(),a.end());//默认的大根堆
  24. for(vector<int>::iterator i=a.begin();i!=a.end();i++)
  25. {
  26. cout<<*i<<ends;
  27. }cout<<endl<<endl;
  28. make_heap(a.begin(),a.end(),cmp);//自制的小根堆
  29. for(vector<int>::iterator i=a.begin();i!=a.end();i++)
  30. {
  31. cout<<*i<<ends;
  32. }cout<<endl<<endl;
  33. a.push_back(2333);
  34. push_heap(a.begin(),a.end(),cmp);//将新加的元素加入堆中
  35. for(vector<int>::iterator i=a.begin();i!=a.end();i++)
  36. {
  37. cout<<*i<<ends;
  38. }cout<<endl<<endl;
  39. a.pop_back(); //删除尾部
  40. for(vector<int>::iterator i=a.begin();i!=a.end();i++)
  41. {
  42. cout<<*i<<ends;
  43. }cout<<endl<<endl;
  44. getchar();getchar();getchar();getchar();
  45. return 0;
  46. }

STL queue

所在库#include

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct student{
  4. int grade;
  5. string name;
  6. };
  7. struct cmp{
  8. bool operator() (student s1,student s2){
  9. return s1.grade < s2.grade;
  10. }
  11. };
  12. int main(int argc, char const *argv[])
  13. {
  14. int n=10,num;
  15. /*
  16. 1. push 【入队插到队尾】
  17. 2. pop 【队首元素出队】
  18. 3. size 【返回队列中元素的个数】
  19. 4. front 【返回队列中第一个元素】
  20. 5. back 【返回队列中最后一个元素】
  21. 6. empty 【判断队列是否为空】
  22. */
  23. //cout<<"队列:"<<endl;
  24. queue<int> a;
  25. for(int i=1;i<n;i++){
  26. num = rand()%233;
  27. a.push(num);
  28. }
  29. //数列长度
  30. cout<<a.size()<<endl;
  31. //数列头元素
  32. cout<<a.front()<<endl;
  33. //数列尾元素
  34. cout<<a.back()<<endl;
  35. //数列是否为空
  36. while(!a.empty()){
  37. cout<<a.front()<<ends;
  38. a.pop();
  39. }cout<<endl<<endl;
  40. priority_queue<int> pq_1;
  41. for(int i=1;i<n;i++){
  42. num = rand()%233;
  43. pq_1.push(num);
  44. }
  45. //默认情况下,数值大的在队首位置(降序)
  46. while(!pq_1.empty()){
  47. //注意这里的访问头元素为.top
  48. cout<<pq_1.top()<<ends;
  49. pq_1.pop();
  50. }cout<<endl;
  51. //以下情况下,数值小的在队首位置(升序)
  52. priority_queue<int,vector<int>,greater<int> > pq_2;
  53. for(int i=1;i<n;i++){
  54. num = rand()%233;
  55. pq_2.push(num);
  56. }
  57. while(!pq_2.empty()){
  58. //注意这里的访问头元素为.top
  59. cout<<pq_2.top()<<ends;
  60. pq_2.pop();
  61. }cout<<endl;cout<<endl;
  62. //运算符重载
  63. priority_queue<student,vector<student>,cmp> q;
  64. student s1,s2,s3;
  65. s1.grade = 90;
  66. s1.name = "Tom";
  67. s2.grade = 80;
  68. s2.name = "Jerry";
  69. s3.grade = 100;
  70. s3.name = "Kevin";
  71. q.push(s1);
  72. q.push(s2);
  73. q.push(s3);
  74. while(!q.empty()){
  75. cout<<q.top().name<<":"<<q.top().grade<<endl;
  76. q.pop();
  77. }
  78. getchar();
  79. return 0;
  80. }

数据结构&堆&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. Android开发关闭虚拟按钮、底部导航条

    在Android开发中,遇到了一系列大大小小的问题,其中一个就是屏蔽底部实体键,我找了很多的博客也尝试了许许多多的方法,但始终不能屏蔽 HOME键,后来看见一篇博客说在Android 4.0以后,屏蔽 ...

  2. 数组的strong copy理解

      一.数组的不同情况下的copy,mutablecopy分析 1.不可变数组的copy(没有创建新对象,复制的只是指针)       2.不可变数组的mutable copy(创建新对象)     ...

  3. 【转】Dubbo声明式缓存

    缓存的应用非常广泛,为了提高数据访问的速度.Dubbo也不例外,它提供了声明式缓存,以减少用户加缓存的工作量. 一.Dubbo中缓存策略 lru 基于最近最少使用原则删除多余缓存,保持最热的数据被缓存 ...

  4. Form表单和里边的小部件

    一.Form表单:form表单是用来收集用户信息,并向后台提交信息的区域表单: 1.属性 “action” 是 “行为“的意思,该属性的值表示:用户提交信息到哪个页面: 2.属性”method“ 是” ...

  5. win32FTP程序设计

    掌握socket基于事件机制的网络程序设计,掌握多线程技术的FTP Server端设计方法,掌握FTP标准基本协议及其程序的实现,掌握文件内容的网络传输设计方法. 利用CFtpServer类接收和解析 ...

  6. hdu2036(多边形面积)

    Description “ 改革春风吹满地, 不会AC没关系; 实在不行回老家, 还有一亩三分地. 谢谢!(乐队奏乐)” 话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也是云里雾里,而 ...

  7. MySQL的数据控制语言DCL

    我们使用DDL的"CREATE USER"语句创建用户,新的SQL用户不允许访问属于其他SQL用户的表,也不能立即创建自己的表,它必须被授权.可以授予的权限包括以下几组: 1.列权 ...

  8. Node.js从入门到实战ECMAScript6一页纸总结(很大的一页纸)

    一.ES5/ES6和babel ECMAScript5,即ES5,是ECMAScript的第五次修订,于2009年完成标准化,现在的浏览器已经相当于完全实现了这个标准.ECMAScript6,即ES6 ...

  9. js面向对象设计之function类

    本文仅探讨如何合理的使用 function 在 javascript中实现一个面向对象设计的类.总所周知,javascript 并不能实现一个真正意义上的类,比如 protect 比如 函数重载.下面 ...

  10. 行动学习方法----PARR