哈夫曼编码实现26个英文字符和部分标点符号

非码方差最小哈夫曼编码

附上此代码中用到的字符频率表

A:7.667
B:1.492
C:2.782
D:4.253
E:11.702
F:2.228
G:2.015
H:5.594
I:6.496
J:0.153
K:0.772
L:4.052
M:2.406
N:6.249
O:7.507
P:1.929
Q:0.095
R:5.487
S:6.327
T:9.056
U:2.758
V:0.978
W:2.360
X:0.150
Y:1.974
Z:0.074
,:1.000
 :2.000
.:0.500

编码,解码代码展示(可运行

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;

const int N = 100;

typedef struct {
	char data;
	double weight;
	int parent;
	int lchild;
	int rchild;
}HTNode;

typedef struct {
	char cd[N];
	int start;
}HCode;

void CreateHT(HTNode ht[], int n0) {
	int i, j, k, lnode, rnode;
	float min1, min2;
	for (i = 0; i < 2 * n0 - 1; i++)
		ht[i].parent = ht[i].lchild = ht[i].rchild = -1;
	for (i = n0; i < 2 * n0 - 1; i++) {
		min1 = min2 = 132767;
		lnode = rnode = -1;
		for (k = 0; k <= i - 1; k++)
			if (ht[k].parent == -1) {
				if (ht[k].weight < min1) {
					min2 = min1;
					rnode = lnode;
					min1 = ht[k].weight;
					lnode = k;
				}
				else if (ht[k].weight < min2) {
					min2 = ht[k].weight;
					rnode = k;
				}
			}
		ht[lnode].parent = i;
		ht[rnode].parent = i;
		ht[i].weight = ht[lnode].weight + ht[rnode].weight;
		ht[i].lchild = lnode;
		ht[i].rchild = rnode;
	}
}

void CreateHCode(HTNode ht[], HCode hcd[], int n0) {
	int i, f, c;
	HCode hc;
	for (i = 0; i < n0; i++) {
		for (int j = 0; j <= n0; j++)
			hc.cd[j] = '-2';
		hc.start = n0;
		c = i;
		f = ht[i].parent;
		while (f != -1) {
			if (ht[f].lchild == c)
				hc.cd[hc.start--] = '0';
			else
				hc.cd[hc.start--] = '1';
			c = f;
			f = ht[f].parent;
		}
		hc.start++;
		hcd[i] = hc;
	}
}

int main() {
	HTNode ht[N];
	HCode hcd[N];
	int n0 = 29;
	//cout << "请输入叶子结点数:";
	//cin >> n0;
	int x[29] = { 7667,1492,2782,4253,11702,2228,2015,5594,6496,153,772,4052,2406,6249,7507,1929,95,5487,6327,9056,2758,978,2360,150,1974,74,1000,2000,500 };
	//cout << "请输入要构建哈夫曼树的叶子节点权重值:";
	//for (int i = 0; i < n0; i++)
		//cin >> x[i];

	for (int i = 0; i < n0; i++)
		ht[i].weight = x[i];//(int)(x[i] * 1000);
	CreateHT(ht, n0);
	//for (int i = 0; i < 15; i++)
		//cout << ht[i].lchild << " ";
	//cout << endl;
	CreateHCode(ht, hcd, n0);
	for (int j = 0; j < n0; j++) {
		switch ((int)ht[j].weight) {
		case 7667:cout << "A" << ":    weigth: "; break;
		case 1492:cout << "B" << ":    weigth: "; break;
		case 2782:cout << "C" << ":    weigth: "; break;
		case 4253:cout << "D" << ":    weigth: "; break;
		case 11702:cout << "E" << ":    weigth:"; break;
		case 2228:cout << "F" << ":    weigth: "; break;
		case 2015:cout << "G" << ":    weigth: "; break;
		case 5594:cout << "H" << ":    weigth: "; break;
		case 6496:cout << "I" << ":    weigth: "; break;
		case 153:cout << "J" << ":    weigth: "; break;
		case 772:cout << "K" << ":    weigth: "; break;
		case 4052:cout << "L" << ":    weigth: "; break;
		case 2406:cout << "M" << ":    weigth: "; break;
		case 6249:cout << "N" << ":    weigth: "; break;
		case 7507:cout << "O" << ":    weigth: "; break;
		case 1929:cout << "P" << ":    weigth: "; break;
		case 95:cout << "Q" << ":    weigth: "; break;
		case 5487:cout << "R" << ":    weigth: "; break;
		case 6327:cout << "S" << ":    weigth: "; break;
		case 9056:cout << "T" << ":    weigth: "; break;
		case 2758:cout << "U" << ":    weigth: "; break;
		case 978:cout << "V" << ":    weigth: "; break;
		case 2360:cout << "W" << ":    weigth:  "; break;
		case 150:cout << "X" << ":    weigth:  "; break;
		case 1974:cout << "Y" << ":    weigth: "; break;
		case 74:cout << "Z" << ":    weigth: "; break;
		case 1000:cout << "," << ":    weigth:     "; break;
		case 2000:cout << " " << ":    weigth:     "; break;
		case 500:cout << "." << ":    weigth:   "; break;
		}
		cout << ht[j].weight*0.001 << ":    HuffmanCode:       ";
		for (int i = 0; i < 100; i++) {
			if (hcd[j].cd[i]=='0'||hcd[j].cd[i]=='1')
				cout << hcd[j].cd[i];
		}
		cout<<endl;
	}

	//编码
	string word;
	cout << "请您输入待编码的码文:";
	getline(cin,word);
	int len = word.length();
	char c;
	for (int i = 0; i < len; i++) {
		c = word[i];
		if (c >= 'a'&&c <= 'z')//大小写一致化;
			c = c - 'a' + 'A';
		switch (c) {
		case 'A':cout << "1101"; break;
		case 'B':cout << "101100"; break;
		case 'C':cout << "01001"; break;
		case 'D':cout << "11111"; break;
		case 'E':cout << "011"; break;
		case 'F':cout << "111101"; break;
		case 'G':cout << "111100"; break;
		case 'H':cout << "0101"; break;
		case 'I':cout << "1010"; break;
		case 'J':cout << "1011011011"; break;
		case 'K':cout << "1011010"; break;
		case 'L':cout << "11101"; break;
		case 'M':cout << "00101"; break;
		case 'N':cout << "1000"; break;
		case 'O':cout << "1100"; break;
		case 'P':cout << "101110"; break;
		case 'Q':cout << "1011011001"; break;
		case 'R':cout << "0011"; break;
		case 'S':cout << "1001"; break;
		case 'T':cout << "000"; break;
		case 'U':cout << "01000"; break;
		case 'V':cout << "1110000"; break;
		case 'W':cout << "00100"; break;
		case 'X':cout << "1011011010"; break;
		case 'Y':cout << "101111"; break;
		case 'Z':cout << "1011011000"; break;
		case ',':cout << "1110001"; break;
		case ' ':cout << "111001"; break;
		case '.':cout << "10110111"; break;
		}
	}
	cout << endl;


	//解码
	string code;
	cout << "请输入待解码的码文:";
	cin >> code;
	int len1 = code.length();
	
	for (int i = -1; i < len1;) {

	hh:;//用作码文跳转
		if (i == len1 - 1) {
			system("pause");
			return 0;
		}
		char c[11] = { '-1' };
		int count = 0;
		c[0] = code[++i];

		if (c[0] == '0') {
			c[1] = code[++i];
			if (c[1] == '0') {
				c[2] = code[++i];
				if (c[2] == '0') { cout << "T"; goto hh; }
				else {
					c[3] = code[++i];
					if (c[3] == '1') { cout << "R"; goto hh; }
					else {
						c[4] = code[++i];
						if (c[4] == '1') { cout << "M"; goto hh; }
						else {
							c[5] = code[++i];
							if (c[5] == '0') { cout << "W"; goto hh; }
						}
					}
				}
			}
			else {
				c[2] = code[++i];
				if (c[2] == '1') { cout << "E"; goto hh; }
				else {
					c[3] = code[++i];
					if (c[3] == '1') { cout << "H"; goto hh; }
					else {
						c[4] = code[++i];
						if (c[4] == '1') { cout << "C"; goto hh; }
						else { cout << "U"; goto hh; }
					}
				}
			}

		}
		else {
			c[1] = code[++i];
			if (c[1] == '0') {
				c[2] = code[++i];
				if (c[2] == '0') {
					c[3] = code[++i];
					if (c[3] == '0') { cout << "N"; goto hh; }
					else { cout << "S"; cout << "S"; goto hh; }
				}
				else {
					c[3] = code[++i];
					if (c[3] == '0') { cout << "I"; goto hh; }
					else {
						c[4] = code[++i];
						if (c[4] == '0') {
							c[5] = code[++i];
							if (c[5] == '0') { cout << "B"; goto hh; }
							else {
								c[6] = code[++i];
								if (c[6] == '0') { cout << "K"; goto hh; }
								else {
									c[7] = code[++i];
									if (c[7] == '1') { cout << "."; goto hh; }
									else {
										c[8] = code[++i];
										if (c[8] == '0') {
											c[9] = code[++i];
											if (c[9] == '0') { cout << "Z"; goto hh; }
											else { cout << "Q"; goto hh; }
										}
										else {
											c[9] = code[++i];
											if (c[9] == '1') { cout << "J"; goto hh; }
											else { cout << "X"; goto hh; }
										}
									}
								}
							}
						}
						else {
							c[5] = code[++i];
							if (c[5] == '0') { cout << "P"; goto hh; }
							else { cout << "Y"; goto hh; }
						}
					}

				}
			}
			else {
				c[2] = code[++i];
				if (c[2] == '0') {
					c[3] = code[++i];
					if (c[3] == '0') { cout << "O"; goto hh; }
					else { cout << "A"; goto hh; }
				}
				else {
					c[3] = code[++i];
					if (c[3] == '0') {
						c[4] = code[++i];
						if (c[4] == '1') { cout << "L"; goto hh; }
						else {
							c[5] = code[++i];
							if (c[5] == '1') { cout << " "; goto hh; }
							else {
								c[6] = code[++i];
								if (c[6] == '0') { cout << "V"; goto hh; }
								else { cout << ","; goto hh; }
							}
						}
					}
					else {
						c[4] = code[++i];
						if (c[4] == '1') { cout << "D"; goto hh; }
						else {
							c[5] = code[++i];
							if (c[5] == '0') { cout << "G"; goto hh; }
							else { cout << "F"; goto hh; }
						}
					}
				}
			}
		}
	}


	
	system("pause");
	return 0;
}
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值