如果不使用 <map>
头文件,你可以自己实现一个简单的哈希表来存储字符和对应的编码。下面是一个示例代码:
#include <iostream>
#include <cstring>
struct HNode {
char data;
int frequency;
HNode* left;
HNode* right;
HNode(char c, int freq) : data(c), frequency(freq), left(nullptr), right(nullptr) {}
};
// 简单的哈希表结构
struct HashMap {
static const int SIZE = 128; // 假设字符范围在 ASCII 0-127
struct Entry {
char key;
std::string value;
Entry* next;
Entry(char k, const std::string& v) : key(k), value(v), next(nullptr) {}
};
Entry* table[SIZE];
HashMap() {
memset(table, 0, sizeof(table));
}
void put(char key, const std::string& value) {
int index = key % SIZE;
if (table[index] == nullptr) {
table[index] = new Entry(key, value);
return;
}
Entry* entry = table[index];
while (entry->next != nullptr)
entry = entry->next;
entry->next = new Entry(key, value);
}
std::string get(char key) {
int index = key % SIZE;
Entry* entry = table[index];
while (entry != nullptr && entry->key != key)
entry = entry->next;
return (entry != nullptr) ? entry->value : "";
}
};
void EncodeHelper(HNode* node, std::string code, HashMap& encoding) {
if (node == nullptr) {
return;
}
if (node->left == nullptr && node->right == nullptr) { // 叶子节点
encoding.put(node->data, code);
return;
}
EncodeHelper(node->left, code + "0", encoding);
EncodeHelper(node->right, code + "1", encoding);
}
HashMap BuildEncoding(HNode* root) {
HashMap encoding;
if (root == nullptr)
return encoding;
EncodeHelper(root, "", encoding);
return encoding;
}
void Encode(char* s, char* d) {
// 统计字符频率
int frequencies[128] = { 0 };
for (int i = 0; s[i] != '\0'; ++i) {
frequencies[s[i]]++;
}
// 构建 Huffman 树
std::vector<HNode*> nodes;
for (int i = 0; i < 128; ++i) {
if (frequencies[i] > 0) {
nodes.push_back(new HNode(static_cast<char>(i), frequencies[i]));
}
}
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);
}
// 构建编码表
HashMap encoding = BuildEncoding(nodes[0]);
// 编码输入字符串
std::string encodedStr;
for (int i = 0; s[i] != '\0'; ++i) {
encodedStr += encoding.get(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;
}
这段代码使用自定义的哈希表结构 HashMap
来存储字符和对应的编码。同样,注意这只是一个简化的示例,实际的编码函数可能需要更多的错误处理和边界条件检查。
内容由零声教学AI助手提供,问题来源于学员提问