请根据哈夫曼编码的原理,编写一个C++程序,只允许使用iostream和stdio.h头文件建立哈夫曼树,实现基于输入的字符及其权值求哈夫曼编码和进行编码解码的功能。 要求: 1. 输出每个字符的哈夫曼编码。 2. 输入由上述若干字符组成的字符串,对电文进行编码并输出。 3. 输入一串哈夫曼编码,进行解码并输出字符串。
时间: 2023-07-19 17:06:50 浏览: 137
以下是基于输入的字符及其权值求哈夫曼编码和进行编码解码的C++程序,只使用iostream和stdio.h头文件建立哈夫曼树。
```
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <unordered_map>
using namespace std;
// 哈夫曼树节点
struct HuffmanNode {
char ch;
int freq;
HuffmanNode* left;
HuffmanNode* right;
HuffmanNode(char c, int f) : ch(c), freq(f), left(nullptr), right(nullptr) {}
};
// 用于优先队列的比较函数
struct Compare {
bool operator()(HuffmanNode* a, HuffmanNode* b) {
return a->freq > b->freq;
}
};
// 建立哈夫曼树
HuffmanNode* buildHuffmanTree(unordered_map<char, int>& freqMap) {
priority_queue<HuffmanNode*, vector<HuffmanNode*>, Compare> pq;
for (auto& p : freqMap) {
pq.push(new HuffmanNode(p.first, p.second));
}
while (pq.size() > 1) {
HuffmanNode* left = pq.top();
pq.pop();
HuffmanNode* right = pq.top();
pq.pop();
HuffmanNode* parent = new HuffmanNode('\0', left->freq + right->freq);
parent->left = left;
parent->right = right;
pq.push(parent);
}
return pq.top();
}
// 递归遍历哈夫曼树,生成哈夫曼编码
void generateHuffmanCode(HuffmanNode* node, string code, unordered_map<char, string>& codeMap) {
if (!node) {
return;
}
if (node->ch != '\0') {
codeMap[node->ch] = code;
}
generateHuffmanCode(node->left, code + "0", codeMap);
generateHuffmanCode(node->right, code + "1", codeMap);
}
// 对字符串进行编码
string encode(string str, unordered_map<char, string>& codeMap) {
string res;
for (char c : str) {
res += codeMap[c];
}
return res;
}
// 对哈夫曼编码进行解码
string decode(string code, HuffmanNode* root) {
string res;
HuffmanNode* curr = root;
for (char c : code) {
if (c == '0') {
curr = curr->left;
} else {
curr = curr->right;
}
if (curr->ch != '\0') {
res += curr->ch;
curr = root;
}
}
return res;
}
int main() {
// 输入字符及其权值
unordered_map<char, int> freqMap;
int n;
printf("请输入字符数量:");
scanf("%d", &n);
printf("请依次输入每个字符的值和权值:\n");
for (int i = 0; i < n; i++) {
char c;
int freq;
scanf(" %c%d", &c, &freq);
freqMap[c] = freq;
}
// 建立哈夫曼树
HuffmanNode* root = buildHuffmanTree(freqMap);
// 生成哈夫曼编码
unordered_map<char, string> codeMap;
generateHuffmanCode(root, "", codeMap);
printf("生成哈夫曼编码:\n");
for (auto& p : codeMap) {
printf("%c: %s\n", p.first, p.second.c_str());
}
// 对字符串进行编码
string str;
printf("请输入要编码的字符串:");
cin >> str;
string code = encode(str, codeMap);
printf("编码结果:%s\n", code.c_str());
// 对哈夫曼编码进行解码
printf("请输入要解码的哈夫曼编码:");
cin >> code;
string decodedStr = decode(code, root);
printf("解码结果:%s\n", decodedStr.c_str());
return 0;
}
```
运行程序,输入字符及其权值、要编码的字符串和要解码的哈夫曼编码,即可得到编码和解码结果。
阅读全文