C++实现霍夫曼编码

本文详细介绍了如何使用C++实现霍夫曼编码,包括Huffman类的声明与实现,通过实例展示了编码过程。
摘要由CSDN通过智能技术生成

Huffman类声明与实现:

Huffman.h

#ifndef HUFFMAN_H
#define HUFFMAN_H
#include<vector>
#include<string>
#include<sstream>
struct Huffman_Node;
class Huffman;
struct Huffman_Node
{
	Huffman_Node() = default;
	Huffman_Node(int w, char W, Huffman_Node *D, Huffman_Node *L,Huffman_Node *R,bool use = false)
	{
		weight = w;
		Word = W;
		Parent = D;
		Left = L;
		Right = R;
		Used = use;
	};
	~Huffman_Node() { };

	int weight;//权值,字符,父节点指针,左右孩子指针。
	char Word;
	Huffman_Node *Parent;
	Huffman_Node *Left;
	Huffman_Node *Right;
	bool Used;
 
};
class Huffman
{
public:
	Huffman() = default;
	Huffman(std::ifstream &In);//构造霍夫曼树。
	~Huffman() { };

	void Codeing();//编码。
	void Translating();//解码。
	void PrintCode();//在显示器上打印编码并格式化的写入文件。
	void PrintTree();//打印构建好的霍夫曼树。

private:
	std::vector<Huffman_Node*> Huf;//储存霍夫曼树节点。
	Huffman_Node *root;
	void print(Huffman_Node* p, std::string s,std::ofstream &Write);//打印霍夫曼树。
};
#endif // !HUFFMAN_H


Huffman.c


#include"Huffman.h"
#include<algorithm>
#include<string>
#include<vector>
#include<stack>
#include<fstream>
#include<sstream>
#include<iostream>
#include<stdlib.h>
bool Less(int &a, int &b);//用于对vector排序的可调用函数。
bool Less(int &a, int &b)//小于。
{
	return (a < b) ? true : false;
}
Huffman::Huffman(std::ifstream &In)//构造函数,初始化数据并构建霍夫曼树。
{
	if (!In.is_open())
	{
		std::cerr << "无法打开文件!" << std::endl;
		return;
	}

	while (!In.eof())
	{
		std::string Line;
		std::getline(In, Line);//从文件中取得一行。
		if (Line.empty())
			continue;
		std::string Word;//文件中的字符。
		std::string Weight;//文件中对应该字符的权值。


		std::istringstream Input(Line);//string流,分离数据。
		Input >> Word;//先提取字符,再提取权值。
		Input >> Weight;


		auto T_n = [](std::string s)->int {return atoi(s.c_str()); };//Lambad,得到int型权值。
		auto T_c = [](std::string ss)->char {return ss[0]; };//Lambad,从string转化为char。
		Huffman_Node *Node = new Huffman_Node(T_n(Weight), T_c(Word), NULL, NULL, NULL);

		Huf.push_back(Node);//储存。
	}


	In.close();//文件读取结束,关闭!
			   //构建霍夫曼树。
	std::vector<int> WeightOfHuf;//获取霍夫曼树节点的权值。
	for (auto X : Huf)
		WeightOfHuf.push_back(X->weight);

	std::sort(WeightOfHuf.begin(), WeightOfHuf.end(), Less);//调用标准库函数,对权值容器内容排序。

	while (WeightOfHuf.size() != 1)
	{
		Huffman_Node *Deal_1 = NULL, *Deal_2 = NULL;//用来处理各个节点。
		for (auto Find_1 : Huf)//找到第一个
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值