10.2优先队列

1.优先队列:优先队列由二叉堆这种数据结构实现,优先队列中的元素具有优先级,
每次对优先级最高的元素进行操作,
2.可以进行的操作有访问堆顶元素,删除堆顶元素,插入一个元素。
其中头文件是:#include<queue>
创建一个优先队列:priority_queue<int> p;
访问队头元素:p.top();
删除一个元素:p.pop();
插入一个元素:p.push(i);
3.优先队列用于解决的问题类型:顺序问题以及哈夫曼树。
4.如果想每次对优先级最小的数据进行操作,则应该这样定义一个队列。
priority_queue<int,vector<int>,greater<int>> p;
/*
例子1:用优先队列弹出最小数的题
1.小结:重载的格式
2.对于结构体的赋值:非指针的赋值不需要new,指针型的需要new
3.printf以及scanf可以使用占位符输入输出。

*/

#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
using namespace std;
struct complex
{
  int real;
  int img;
  complex(int a,int b):real(a),img(b){}//注意不能漏掉变量类型
  bool operator< (complex c) const{
    if(real*real+img*img==c.real*c.real+c.img*c.img)
    {
        return img>c.img;
    }
    else{
        return real*real+img*img<c.real*c.real+c.img*c.img;

    }
}//重载小于号必须写在结构体里面

};


int main()
{
  int n;
  while(scanf("%d",&n)!=EOF)
  {
    string str;
    priority_queue<complex> p;
    for(int i=0;i<n;i++)
    {
      cin>>str;
        if(str=="Pop")
        {
          if(p.empty())
          {
              printf("empty\n");
          }
            else{
                complex c = p.top();
               printf("%d+i%d\n",c.real,c.img);
                p.pop();
                printf("SIZE = %d\n",p.size());
            }
        }
        else{
            int a,b;
           scanf("%d+i%d",&a,&b);
           complex c = complex(a,b);//注意new 与不new
            p.push(c);
            printf("SIZE = %d\n",p.size());
        }

    }

  }


  return 0;
}




/*
哈夫曼树的应用
*/
#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;

int main()
{
   int n;
    int number;
    while(scanf("%d",&n)!=EOF)
    {
      priority_queue<int,vector<int>,greater<int>> p;
      for(int i=0;i<n;i++)
      {
          scanf("%d",&number);
          p.push(number);
      }
       int answer=0;
      while(p.size()>1)
      {
          int a=p.top();
          p.pop();
          int b=p.top();
          p.pop();
         answer+=a+b;
          p.push(a+b);
      }
        printf("%d\n",answer);
        
    }
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 基本概念 1.1 概观:系统生命周期 1.2 指针和动态存储分配 1.3 算法形式规范 1.4 数据抽象 1.5 性能分析 1.6 性能度量 1.7 参考文献和选读材料 第2章 数组和结构 2.1 数组 2.2 数组的动态存储分配 2.3 结构体和联合体 2.4 多项式 2.5 稀松矩阵 2.6 多维数组的表示 2.7 字符串 2.8 参考文献和选读材料 2.9 补充习题 第3章 栈与队列 3.1 栈 .3.2 动态栈 3.3 队列 3.4 动态循环队列 3.5 迷宫问题 3.6 表达式求值 3.7 多重栈与多重队列 3.8 补充习题 第4章 链表 4.1 单向链表 4.2 用C语言表示单向链表 4.3 链式栈与链式队列 4.4 多项式 4.5 其它链表操作 4.6 等价类 4.7 稀疏矩阵 4.8 双向链表 第5章 树 5.1 引论 5.2 二叉树 5.3 遍历二叉树 5.4 其它二叉树操作 5.5 线索二叉树 5.6 堆 5.7 二叉查找树 5.8 选拔树 5.9 森林 5.10 不相交集合的表示 5.11 二叉树的计数 5.12 参考文献和选读材料 第6章 图 6.1 图的抽象数据类型 6.2 图的基本操作 6.3 最小代价生成树 6.4 最短路径和迁移闭包 6.5 活动网络 6.6 参考文献和选读材料 6.7 补充习题 第7章 排序 7.1 动机 7.2 插入排序 7.3 快速排序 7.4 排序最快有多快 7.5 归并排序 7.6 堆排序 7.7 多关键字排序 7.8 链表排序和索引表排序 7.9 内部排序小结 7.10 外部排序 7.11 参考文献和选读材料 第8章 Hash法 8.1 引言 8.2 静态Hash法 8.3 动态Hash法 8.4 Bloom滤波器 8.5 参考文献和选读材料 第9章 优先队列 9.1 单端优先队列和双端优先队列 9.2 左倾树 9.3 二项式堆 9.4 Fibonacci堆 9.5 配偶堆 9.6 对称最小-最大堆 9.7 区间堆 9.8 参考文献和选读材料 第10章 高效二叉查找树 10.1 最优二叉查找树 10.2 AVL树 10.3 红-黑树 10.4 Splay树 10.5 参考文献和选读材料 第11章 多路查找树 11.1 m-路查找树 11.2 B-树 11.3 B+树 11.4 参考文献和选读材料 第12章 数字查找结构 12.1 数字查找树 12. 2 二路Trie树和Patricia树 12.3 多路Trie树 12.4 后缀树 12.5 Trie树和互联网的包转发 12.6 参考文献和选读材料

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值