程序示例精选
哈夫曼编码实现文件的压缩和解压
如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!
前言
这篇博客针对《哈夫曼编码实现文件的压缩和解压》编写代码,代码整洁,规则,易读。 学习与应用推荐首选。
运行结果
文章目录
一、所需工具软件
二、使用步骤
1. 主要代码
2. 运行结果
三、在线协助
一、所需工具软件
1. VS2019, Qt
2. C++
二、使用步骤
代码如下(示例):
#include<iostream>
#include <fstream>
#include<map>
#include<queue>
#include <string>
using namespace std;
// 二叉树结点
struct HuffmanNode {
HuffmanNode* lChild = nullptr; //左孩子,一定要初始化,否则就会出很麻烦的问题。
HuffmanNode* rChild = nullptr; //右孩子
char Data = '#'; //存储的字符
int Weight; //构建结点的时候存储权重,即频率
HuffmanNode(char Data, int Weight) {
this->Data = Data;
this->Weight = Weight;
}
HuffmanNode() {};
};
// 自定义HuffmanNode比较函数
struct HuffmanNodeCompareWeightGreater
{
bool operator() (const HuffmanNode *a, const HuffmanNode *b)
{
return a->Weight > b->Weight; // 小顶堆
}
};
class HuffmanTree {
HuffmanNode* root;
map <char, string> HuffmanMap; //存储了对应字符和编码的map,解压的时候用与对照还原。
map <char, int> OriginMap; //用于构建哈夫曼树之前统计频率所用,存储的是字符和对应的频率
//字符频率统计,并存入最初的(字符-编码)map中
void GiveWeight(char str);
//构建哈夫曼树,
void CreateHuffmanTree();
//文件读取,并统计字符和频率以此来构建OriginMap
void ReadFile();
//遍历哈夫曼树所得到的字符以及编码得到新的映射,以字符串s形式存储处理后的Huffman编码
void DisplayHuffmanTree(HuffmanNode* Temp, string s);
//Pre为先序遍历,用来检验生成的树是否正确
void Pre(HuffmanNode* p);
public:
HuffmanTree() {
root = new HuffmanNode();
}
//文件压缩并写入,对应着源文件和HuffmanMap中的编码一个一个的输出到新的文件
void ZIP();
//文件解压,
void UNZIP();
};
//构建哈夫曼树,
void HuffmanTree::CreateHuffmanTree() {
//遍历原始的map并根据其键值对逐一构建结点
priority_queue<HuffmanNode*, vector<HuffmanNode*>, HuffmanNodeCompareWeightGreater> HuffmanQueue;
map<char, int>::iterator it = OriginMap.begin();
while (it != OriginMap.end()) {
//这个每循环一次就取出一组键和值
char ch = it->first;
int frequency = it->second;
HuffmanNode *temp = new HuffmanNode(ch, frequency); //构建结点,ch即为每个节点存储的字符
int main() {
HuffmanTree hfTree;
hfTree.ZIP();
hfTree.UNZIP();
}
运行结果
三、在线协助:
如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助!
1)远程安装运行环境,代码调试
2)Visual Studio, Qt, C++, Python编程语言入门指导
3)界面美化
4)软件制作
当前文章连接:https://blog.csdn.net/alicema1111/article/details/132666851
个人博客主页:https://blog.csdn.net/alicema1111?type=blog
博主所有文章点这里:https://blog.csdn.net/alicema1111?type=blog