不允许使用map、vector、list、queue等STL容器,头文件只允许使用iostream或stdio.h以及自己编的头文件,建立哈夫曼树,实现基于输入的字符及其权值求哈夫曼编码和进行编码解码的功能。要求:1.输出每个字符的哈夫曼编码。2.输入由上述若干字符组成的字符串,对电文进行编码并输出。3. 输入一串哈夫曼编码,进行解码并输出字符串。用C++写出代码

时间: 2024-02-01 14:13:15 浏览: 25
以下是基于输入的字符及其权值求哈夫曼编码和进行编码解码的C++代码,不使用STL容器: ``` #include <iostream> #include <vector> using namespace std; struct Node { char ch; // 存储字符 int weight; // 存储权值 Node* left; // 存储左子节点 Node* right; // 存储右子节点 Node(char c, int w): ch(c), weight(w), left(NULL), right(NULL) {} }; void buildHuffmanTree(vector<Node*>& nodes) { while (nodes.size() > 1) { // 找到权值最小的两个节点 int min1 = 0, min2 = 1; if (nodes[min1]->weight > nodes[min2]->weight) swap(min1, min2); for (int i = 2; i < nodes.size(); i++) { if (nodes[i]->weight < nodes[min1]->weight) { min2 = min1; min1 = i; } else if (nodes[i]->weight < nodes[min2]->weight) { min2 = i; } } // 创建新节点,将两个最小节点作为自己的左、右子节点 Node* newNode = new Node(0, nodes[min1]->weight + nodes[min2]->weight); newNode->left = nodes[min1]; newNode->right = nodes[min2]; // 删除已经合并的两个节点,将新节点加入vector nodes.erase(nodes.begin() + max(min1, min2)); nodes.erase(nodes.begin() + min(min1, min2)); nodes.push_back(newNode); } } void generateHuffmanCode(Node* root, string code, vector<string>& codes) { if (root == NULL) return; if (root->left == NULL && root->right == NULL) { codes[root->ch] = code; return; } generateHuffmanCode(root->left, code + "0", codes); generateHuffmanCode(root->right, code + "1", codes); } string encode(string s, vector<string>& codes) { string encoded; for (char c : s) { encoded += codes[c]; } return encoded; } string decode(string s, Node* root) { string decoded; Node* cur = root; for (char c : s) { if (c == '0') { cur = cur->left; } else { cur = cur->right; } if (cur->left == NULL && cur->right == NULL) { decoded += cur->ch; cur = root; } } return decoded; } int main() { // 输入字符及其权值 vector<char> chars; vector<int> weights; int n; cout << "请输入字符种类数:"; cin >> n; for (int i = 0; i < n; i++) { char c; int w; cout << "请输入第" << i + 1 << "个字符和它的权值:"; cin >> c >> w; chars.push_back(c); weights.push_back(w); } // 建立哈夫曼树 vector<Node*> nodes; for (int i = 0; i < n; i++) { nodes.push_back(new Node(chars[i], weights[i])); } buildHuffmanTree(nodes); Node* root = nodes[0]; // 生成哈夫曼编码 vector<string> codes(256); generateHuffmanCode(root, "", codes); // 输出每个字符的哈夫曼编码 cout << "每个字符的哈夫曼编码如下:" << endl; for (int i = 0; i < 256; i++) { if (!codes[i].empty()) { cout << char(i) << ": " << codes[i] << endl; } } // 对电文进行编码并输出 string s; cout << "请输入要编码的电文:"; cin >> s; string encoded = encode(s, codes); cout << "编码后的电文为:" << encoded << endl; // 进行解码并输出字符串 cout << "请输入要解码的哈夫曼编码:"; cin >> encoded; string decoded = decode(encoded, root); cout << "解码后的电文为:" << decoded << endl; return 0; } ```

相关推荐

最新推荐

recommend-type

vector,map,list,queue的区别详细解析

如果我们需要随机访问一个容器则vector要比list好得多。如果我们已知要存储元素的个数则vector 又是一个比list好的选择。如果我们需要的不只是在容器两端插入和删除元素则list显然要比vector好
recommend-type

C#使用队列(Queue)解决简单的并发问题

主要介绍了使用队列(Queue)解决简单的并发问题,讲解的很细致,喜欢的朋友们可以了解一下
recommend-type

freeswitch动态获取queue队列.doc

freeswitch queue队列动态获取(dialplan,gateway同理),我做的每一步都写上了,有兴趣的可以看看
recommend-type

Redis 不使用 keys 命令获取键值信息的方法

这个问题可能看起来很奇怪,但很多 redis 集群会有一个统一的入口,入口会作兼容 redis 命令的代理,一般出于新能考虑是禁止使用 keys 命令来获取键值信息的,但是可以通过 scan 命令来代替 keys 2. 使用 keys 的...
recommend-type

鸡国大冒险运行程序,点开即用

recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。