1. 优先队列小析

     优先队列的模板: template <class T, class Container = vector<T>,class Compare = less<typename Container::value_type> > class priority_queue;

 可以看出priority_queue的模板声明带有三个参数,T为数据类型,Container为保存数据的容器,,Compare为元素比较方式,其中Container必须是用数组实现的容器,比如vector,deque,不能用list.STL里面容器默认用的是 vector. 比较方式默认用 operator< ,所以如果你把后面俩个参数 缺省的话,优先队列就是大顶堆。如果要用到小顶堆,则一般要把模板的三个参数都带进去。STL里面定义了一个仿函数 greater<Type>,对于基本类型可以用这个仿函数声明小顶堆。引用自(DanielWang_).
  在求解Huffman编码里面,我们需要用到小顶堆性质,而且元素还是指针元素.因此我们使用如下的方式定义优先队列,把模板的三个参数都带进去,并且还自定义了仿函数.

typedef struct HTNode{
char c;
unsigned int freq;
HTNode *lchild, *rchild; //构造函数
HTNode(char key='\0', unsigned int fr=, HTNode *l=NULL, HTNode *r=NULL):
c(key),freq(fr),lchild(l),rchild(r){}; }HTNode,*pNode; //重载优先队列里的比较运算符
struct cmp{
bool operator()(pNode node1, pNode node2){
return node1->freq > node2->freq;
}
}; //含有指针类型的优先队列
priority_queue<pNode, vector<pNode>, cmp> pq;

  2. 具体实现代码 


在打印Huffman 编码的时候,还用到了string的一个函数,erase,即删除某个字符.因为end()返回string的最后一个字符的下一个位置,那么就可以用如下的方法删除最后一个字符.
str.erase(str.end()-1); //删除最后一个字符
 
*************************************************************************
> File Name: Huffman_code_pg.cpp
> Author: He Xingjie
> Mail: gxmshxj@.com
> Created Time: 2014年06月06日 星期五 08时57分01秒
> Description:
************************************************************************/
#include<iostream>
#include<queue>
#include<vector>
#include<cstdio>
#include<stack> using namespace std; typedef struct HTNode{
char c;
unsigned int freq;
HTNode *lchild, *rchild; //构造函数
HTNode(char key='\0', unsigned int fr=, HTNode *l=NULL, HTNode *r=NULL):
c(key),freq(fr),lchild(l),rchild(r){}; }HTNode,*pNode; //重载优先队列里的比较运算符
struct cmp{
bool operator()(pNode node1, pNode node2){
return node1->freq > node2->freq;
}
}; //含有指针类型的优先队列
priority_queue<pNode, vector<pNode>, cmp> pq; void HuffmanCode(int n)
{
pNode l, r; //从优先队列中找出优先级最小的两个元素,合并,并
//把它加入到优先队列中
while (pq.size() > )
{
pNode z = new HTNode; l = pq.top();
pq.pop();
r = pq.top();
pq.pop(); z->lchild = l;
z->rchild = r;
z->freq = l->freq + r->freq; pq.push(z);
}
} void PrintCode(pNode t, string str)
{
//中序递归遍历HuffmanTree求解HuffmanCode
if (t == NULL)
return;
if (t->lchild)
{
str += '';
PrintCode(t->lchild, str);
} //叶子节点
if (t->lchild == NULL && t->rchild == NULL)
{
cout<<t->c<<"'s code: "<<str<<endl;
} str.erase(str.end()-); //删除最后一个字符 if (t->rchild)
{
str += '';
PrintCode(t->rchild, str);
}
} void DFS(HTNode *t)
{
HTNode *node;
stack<pNode, vector<pNode> > pstack; pstack.push(t);
node = pstack.top();
pstack.pop(); while (pstack.size() > )
{
if (node->lchild)
{
pstack.push(node->lchild);
node = node->lchild;
}
else if(node->rchild)
{
pstack.push(node->rchild);
node = node->rchild;
}
else
{
printf("%d ", node->freq);
node = pstack.top();
pstack.pop();
}
}
} int main()
{
int n, i;
FILE *fp;
char tmp;
string str; fp = fopen("in.txt", "r");
if (fp ==NULL)
{
printf("fopen error!\n");
return -;
} //输入大小
fscanf(fp, "%d", &n);
fscanf(fp, "%c", &tmp); //输入数据
for (i=; i<n; i++)
{
char c;
int freq;
pNode p = new HTNode; fscanf(fp, "%c%d", &c, &freq);
p->c = c;
p->freq = freq; fscanf(fp, "%c", &tmp); pq.push(p);
} HuffmanCode(n);
PrintCode(pq.top(), str); return ;
}

 参考:

http://www.cplusplus.com/reference/queue/priority_queue/?kw=priority_queue

http://blog.csdn.net/liuzhanchen1987/article/details/7856893

http://blog.csdn.net/daniel_ustc/article/details/17613359

最新文章

  1. 前端编辑工具之VSCode
  2. Tween公式 以及四个参数
  3. Android 在线SDK更新 和谐被墙解决
  4. 基于Spark1.3.0的Spark sql三个核心部分
  5. java使用split切割字符串的时候,注意转义字符
  6. linux笔记:linux常用命令-文件处理命令
  7. TestCase--网站登录模块
  8. Java从入门到精通(一)
  9. Java学习之DBUtils工具的学习
  10. UIWebView 使用要注意的几点
  11. 【转】session和cookie详解
  12. php 两个数组,若键相同,则值合并
  13. ES 6 系列 - 对于常用对象的拓展 api
  14. HTML中select的option设置selected=&quot;selected&quot;无效的解决方案
  15. mysql 5.7多源复制(用于生产库多主库合并到一个查询从库)
  16. Mac下配置Apache服务器
  17. Linux下出现command not found的解决办法
  18. 纯CSS仿制Google女生节Doodle
  19. FileInputStream与FileOutputStream类 Reader类和Writer类 解析
  20. Apach 配置虚拟机时候DocumentRoot参数最后不要加斜杠

热门文章

  1. php byte数组与字符串转换类
  2. 新公司入职第一天遇到的 关于 CSS 单行溢出文本显示省略号...的问题
  3. [leetcode 17]Letter Combinations of a Phone Number
  4. [MFC] MFC编译程序,缺少MFC动态链接库的解决
  5. [ACM_搜索] Triangles(POJ1471,简单搜索,注意细节)
  6. DataGridView绑定复杂实体(属性本身又是实体)
  7. 博客搬家了,欢迎访问 http://blog.csdn.net/yinpengxiang/
  8. 如何在ASP.NET中用C#将XML转换成JSON
  9. iOS----友盟分享完善版本
  10. JAVA学习Swing章节JPanel和JScrollPane面板的简单学习