C++实现哈夫曼编码

 更新时间:2020年04月28日 08:56:11   作者:南小呗  
这篇文章主要为大家详细介绍了C++实现哈夫曼编码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C++实现哈夫曼编码的具体代码,供大家参考,具体内容如下

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

int Max = 300;

class tree{
 public:
 char s;
 int num;
 tree *left;
 tree *right;
 tree(){
  s= '!';
  num = 0;
  left = 0;
  right = 0;
 }
 tree(char a,int n,tree* p1,tree* p2){
  s = a;
  num = n;
  left = p1;
  right = p2;
 }
};

vector<tree *> open;

/*********************************
**中序遍历输出各节点及其哈夫曼编码
*********************************/ 
void inorder(tree *t,string s){
 if(t != 0){
 inorder(t->left,s+'0');
 if(t->s != '!')
  cout<<t->s<<":"<<s<<endl;
 inorder(t->right,s+'1');
 }
}


int main(){
 int a[Max];
 for(int i = 0;i < Max;i++)
 a[i] = 0;  //初始化数组 
 string s;
 cout<<"请输入字符串:";
 cin>>s;
 
 vector<char> v;
 vector<char>::iterator vit;
 for(int i = 0;i < s.length();i ++){
 a[s[i]]++;  //确定每个字符出现的次数(频率) 
 vit = find(v.begin(),v.end(),s[i]);
 if(vit == v.end()) //相同的字符只保留一个 
  v.push_back(s[i]);
 }
 for(int i = 0;i < v.size();i ++){
 tree *n = new tree();
 n->s = v[i];
 n->num = a[v[i]];
 open.push_back(n); //存入open表中 
 }
 
 /************************
 **
 **构造哈夫曼树 
 **
 *************************/ 
 tree *root;
 while(open.size() != 1){
 tree *min1,*min2; //min1,min2是当前open表中num值最小的节点 
 int sit1,sit2;
 min1 = open.front();
 sit1 = 0;
 for(int i = 0;i < open.size();i++){
  if(open[i]->num < min1->num){
  min1 = open[i];
  sit1 = i;
  }
 }
 open.erase(open.begin()+sit1);
 
 min2 = open.front();
 sit2 = 0;
 for(int i = 0;i < open.size();i++){
  if(open[i]->num < min2->num){
  min2 = open[i];
  sit2 = i;
  }
 }
 open.erase(open.begin()+sit2);
 
 tree *t = new tree('!',min1->num + min2->num,min1,min2); //构造新节点,左右指针指min1和min2 
 open.push_back(t); //存入open表中 
 root = t;
 }
 
 cout<<"它的哈夫曼编码为:"<<endl;
 string s1 = "";
 inorder(root,s1);
 
 return 0;
}```

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Opencv透视变换综合实例详解

    Opencv透视变换综合实例详解

    这篇文章主要为大家详细介绍了Opencv透视变换综合实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 使用C++ MFC编写一个简单的五子棋游戏程序

    使用C++ MFC编写一个简单的五子棋游戏程序

    这篇文章主要介绍了使用C++ MFC编写一个简单的五子棋游戏程序,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • VS2019项目打包生成.exe文件与Setup的步骤实现

    VS2019项目打包生成.exe文件与Setup的步骤实现

    这篇文章主要介绍了VS2019项目打包生成.exe文件与Setup的步骤实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • C++ 智能指针的魅力你都了解吗

    C++ 智能指针的魅力你都了解吗

    智能指针使用和普通指针类似。解引用一个智能指针返回它指向的对象。如果在一个条件判断中使用智能指针,效果就是检测它是否为空,本文给大家介绍C++ 智能指针的相关知识,感兴趣的朋友一起看看吧
    2021-06-06
  • C++函数中return语句的使用方法

    C++函数中return语句的使用方法

    C++中的return语句是函数中一个重要的语句,return语句用于结束当前正在执行的函数,并将控制权返回给调用此函数的函数,需要的朋友可以了解下
    2012-12-12
  • C++使用string的大数除法运算(4)

    C++使用string的大数除法运算(4)

    这篇文章主要为大家详细介绍了C++使用string的大数除法运算,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • OpenCV中C++函数imread读取图片的问题及解决方法

    OpenCV中C++函数imread读取图片的问题及解决方法

    利用C++函数imread读取图片的时候返回的结果总是空,而利用C函数cvLoadImage时却能读取到图像。怎么回事?今天小编通过本教程给大家简单说明原因
    2017-03-03
  • C语言读写配置文件的方法

    C语言读写配置文件的方法

    这篇文章主要介绍了C语言读写配置文件的方法,包括C语言读写ini配置文件所涉及的文件读写技巧,以及完整的源文件及头文件实现方法,需要的朋友可以参考下
    2015-07-07
  • C++调用C函数实例详解

    C++调用C函数实例详解

    这篇文章主要介绍了C++调用C函数实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • C语言实现简单弹跳球游戏

    C语言实现简单弹跳球游戏

    这篇文章主要为大家详细介绍了C语言实现简单弹跳球游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03

最新评论