C++实现哈夫曼编码

作者:南小呗 时间:2022-07-20 20:39:01 

本文实例为大家分享了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;
}```

来源:https://blog.csdn.net/TKFEET/article/details/89394104

标签:C++,哈夫曼编码
0
投稿

猜你喜欢

  • SpringSecurity Jwt Token 自动刷新的实现

    2022-04-28 18:49:45
  • JAVA注解代码详解一篇就够了

    2022-12-27 14:45:26
  • Android实现WebView删除缓存的方法

    2023-02-19 08:38:22
  • java连接SQL Server数据库的方法

    2022-10-14 04:16:56
  • Java模拟QQ桌面截图功能实现方法

    2021-09-19 16:30:02
  • C#文件断点续传实现方法

    2023-09-07 18:35:05
  • Java date format时间格式化操作示例

    2021-10-28 19:12:24
  • C# 利用代理爬虫网页的实现方法

    2023-02-26 18:51:43
  • DrawerLayout的简单使用及侧滑菜单实现详解

    2023-04-27 04:10:59
  • springboot整合mybatis的超详细过程(配置模式+注解模式)

    2023-10-03 09:54:03
  • SpringBoot使用validation-api实现参数校验的示例

    2022-12-02 14:33:40
  • Android开发之关于项目

    2023-05-08 23:38:24
  • C#中的延时函数sleep

    2022-08-05 13:16:49
  • Java语言实现简单FTP软件 FTP软件效果图预览之上传功能(3)

    2022-03-28 10:16:21
  • Java基于栈方式解决汉诺塔问题实例【递归与非递归算法】

    2023-04-10 08:05:02
  • Android四种常见布局方式示例教程

    2022-05-25 09:35:03
  • Android webview与js的数据交互

    2021-08-18 02:56:32
  • Android封装MVP实现登录注册功能

    2021-06-14 20:45:08
  • Java进阶:Struts多模块的技巧

    2023-06-18 09:40:47
  • Android Studio3.6设置Gradle Offline Mode的方法

    2022-07-26 09:36:01
  • asp之家 软件编程 m.aspxhome.com