如果不使用 <unordered_map>
头文件,你可以使用标准库中的 std::map
或者自己实现一个简单的哈希表来存储字符和对应的编码。下面是一个示例代码:
#include <iostream>
#include <map>
#include <string>
struct HNode {
char data;
int frequency;
HNode* left;
HNode* right;
HNode(char c, int freq) : data(c), frequency(freq), left(nullptr), right(nullptr) {}
};
void EncodeHelper(HNode* node, std::string code, std::map<char, std::string>& encoding) {
if (node == nullptr) {
return;
}
if (node->left == nullptr && node->right == nullptr) { // 叶子节点
encoding[node->data] = code;
return;
}
EncodeHelper(node->left, code + "0", encoding);
EncodeHelper(node->right, code + "1", encoding);
}
std::map<char, std::string> BuildEncoding(HNode* root) {
std::map<char, std::string> encoding;
if (root == nullptr)
return encoding;
EncodeHelper(root, "", encoding);
return encoding;
}
void Encode(char* s, char* d) {
// 统计字符频率
std::map<char, int> frequencies;
for (int i = 0; s[i] != '\0'; ++i) {
frequencies[s[i]]++;
}
// 构建 Huffman 树
std::vector<HNode*> nodes;
for (const auto& pair : frequencies) {
nodes.push_back(new HNode(pair.first, pair.second));
}
while (nodes.size() > 1) {
std::sort(nodes.begin(), nodes.end(), [](HNode* a, HNode* b) {
return a->frequency > b->frequency;
});
HNode* left = nodes.back();
nodes.pop_back();
HNode* right = nodes.back();
nodes.pop_back();
HNode* parent = new HNode('\0', left->frequency + right->frequency);
parent->left = left;
parent->right = right;
nodes.push_back(parent);
}
// 构建编码表
std::map<char, std::string> encoding = BuildEncoding(nodes[0]);
// 编码输入字符串
std::string encodedStr;
for (int i = 0; s[i] != '\0'; ++i) {
encodedStr += encoding[s[i]];
}
strcpy(d, encodedStr.c_str());
}
int main() {
char str[100];
char encoded[100];
std::cout << "Enter a string to encode: ";
std::cin >> str;
Encode(str, encoded);
std::cout << "Encoded string: " << encoded << std::endl;
return 0;
}
这段代码使用 std::map
来代替 std::unordered_map
存储字符和对应的编码。同样,注意这只是一个简化的示例,实际的编码函数可能需要更多的错误处理和边界条件检查。
内容由零声教学AI助手提供,问题来源于学员提问