编写一个能够生成哈夫曼编码并输出的C++程序。
时间: 2024-04-09 14:29:06 浏览: 105
当然可以!以下是一个简单的C++程序示例,用于生成哈夫曼编码并输出:
```cpp
#include <iostream>
#include <queue>
#include <unordered_map>
using namespace std;
// 哈夫曼树节点
struct HuffmanNode {
char data;
unsigned freq;
HuffmanNode* left, * right;
HuffmanNode(char data, unsigned freq) {
left = right = nullptr;
this->data = data;
this->freq = freq;
}
};
// 哈夫曼树节点比较函数
struct compare {
bool operator()(HuffmanNode* l, HuffmanNode* r) {
return l->freq > r->freq;
}
};
// 生成哈夫曼树
HuffmanNode* buildHuffmanTree(const unordered_map<char, unsigned>& freqMap) {
priority_queue<HuffmanNode*, vector<HuffmanNode*>, compare> pq;
for (const auto& pair : freqMap) {
pq.push(new HuffmanNode(pair.first, pair.second));
}
while (pq.size() != 1) {
HuffmanNode* left = pq.top();
pq.pop();
HuffmanNode* right = pq.top();
pq.pop();
HuffmanNode* newNode = new HuffmanNode('$', left->freq + right->freq);
newNode->left = left;
newNode->right = right;
pq.push(newNode);
}
return pq.top();
}
// 生成哈夫曼编码表
void generateHuffmanCodes(HuffmanNode* root, string code, unordered_map<char, string>& codes) {
if (root == nullptr) {
return;
}
if (root->data != '$') {
codes[root->data] = code;
}
generateHuffmanCodes(root->left, code + "0", codes);
generateHuffmanCodes(root->right, code + "1", codes);
}
// 输出哈夫曼编码
void printHuffmanCodes(const unordered_map<char, string>& codes) {
cout << "哈夫曼编码:" << endl;
for (const auto& pair : codes) {
cout << pair.first << " : " << pair.second << endl;
}
}
// 主函数
int main() {
unordered_map<char, unsigned> freqMap;
string str;
cout << "请输入字符串:";
getline(cin, str);
// 统计字符频率
for (char c : str) {
freqMap[c]++;
}
// 构建哈夫曼树
HuffmanNode* root = buildHuffmanTree(freqMap);
// 生成哈夫曼编码表
unordered_map<char, string> codes;
generateHuffmanCodes(root, "", codes);
// 输出哈夫曼编码
printHuffmanCodes(codes);
return 0;
}
```
你可以将上面的代码保存到一个名为 `huffman.cpp` 的文件中,然后使用C++编译器编译运行该程序。程序会要求你输入一个字符串,然后生成对应的哈夫曼编码并输出。
请注意,以上只是一个基本的示例程序,仅用于演示哈夫曼编码的生成过程。在实际应用中,可能需要进行更多的错误处理和优化。
阅读全文