ZBLOG

不包含头文件

如果不使用 <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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=14405

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?