课程设计:C++实现哈夫曼编码

功能实现:

  • //1:先计算每个字符的权重
  • //2:构建哈夫曼树
  • //3:得出每个字符的哈夫曼编码。
  • //4:根据哈夫曼编码转化为字符

代码实现:

// 哈夫曼编码.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//1:先计算每个字符的权重
//2:构建哈夫曼树
//3:得出每个字符的哈夫曼编码。#include<iostream>
#include<string>
using namespace std;class node {
public:char value;int weight;//权重node* left;node* right;string code;//编码int zhi;node() {left = NULL;right = NULL;zhi = 0;weight = 0;}node( int a) {this->weight = a;}void showa() {cout << value<<"  "<< weight<<"  "<<code<<endl;}
};
void note(int notes[][26], string  target) {	//进行接受整理for (int i = 0; i < 26; i++) {//记录每个字母出现次数notes[0][i] = 97 + i;//将本中第一行都分别记录一个小写字母的编码,}for (char a : target) {//auto是一个占位符(auto a:target),根据后面的变量,自己推断自己是什么类型,用于变量类型很长for (int i = 0; i < 26; i++) {if (notes[0][i] == a) {notes[1][i]++;break;}}}
}
void chang_shuzu(node target1[],int& j,int notes[][26]) {//创建所需数组cout << "电文中出现的字符及其出现的次数如下" << endl;for (int i = 0; i < 26; i++) {if (notes[1][i] != 0) {cout << (char)notes[0][i] << ":" << notes[1][i] << endl;target1[j].value = (char)notes[0][i];//构建存储字符和权重的数组target1[j].zhi = 1;target1[j++].weight = notes[1][i];}}
}
void maopao(node target1[],int last,int farst) {//运用冒泡排序,将数组根据权重变成递增数组for (int i = farst; i < last-1; i++) {for (int j = farst; j < last- 1; j++) {if (target1[j].weight > target1[j + 1].weight) {node temp;temp = target1[j];target1[j] = target1[j + 1];target1[j + 1] = temp;}}}
}
void change_hafuma(node target1[],int &farst,node target2[],int &s) {//取出数组的前两个,将其投入到创建链表中,后来再将数组前两个删除,存入新结合的树target2[s].weight = target1[farst].weight + target1[farst + 1].weight;target2[s+1]= target1[farst];target2[s+2] = target1[farst + 1];target2[s].left = &target2[s+1];target2[s].right = &target2[s+2];farst++;target1[farst] = target2[s];s = s + 3;
}
void show(node* x,string h,node target3[],int &e) {//h为编码if (x->zhi==1) {//则此时指向的是叶子节点x->code = h;cout << x->value << ':' << h<<endl;target3[e].value = x->value;target3[e++].code = x->code;return;}show(x->left, h + "0", target3,e);show(x->right, h +"1", target3,e);
}
void show2(string target,node target3[],int last) {//展示电文对应编码cout << "电文对应编码为:" << endl;for (char a : target) {for (int i = 0; i < 100; i++) {if (a == target3[i].value) {cout << target3[i].code << " ";break;}}}cout << endl;}
void decode(node target3[],int last){string target;string p="";cout << "输入0-1二进制串(‘e’退出)";cin >> target;while (target!="e") {string he = "";for (char a : target) {he += a;for (int i = 0; i < last; i++) {if (he == target3[i].code) {p += target3[i].value;p += " ";he = "";break;}}}if (he != "") {cout << "编码错误,无法转换!"<<endl<<endl;}else{cout <<"编译转换的电文为:" << p<<endl << endl;}p = "";cout << "输入0-1二进制串(‘e’退出)";cin >> target;}
}
int main() {//接收端int notes[2][26] = { 0 };//令其初始都为0.cout << "输入电文:";string target;cin >> target;//用了for—each循环遍历note(notes,target);node target1[26];//初始记录有效节点node target2[100];//存储哈夫曼树所有节点node target3[26];//记录有效节点,此时其内节点中有每个节点的code值int last = 0;//指向最后一个有效数组元素的后一个int farst = 0;int s = 0;//存哈夫曼节点的数组chang_shuzu(target1, last, notes);//创建数组//构建哈夫曼树int z = 0;int e = 0;while (last - farst != 1) {maopao(target1,last,farst);change_hafuma(target1, farst,target2,s);}node x;x = target1[farst];cout << "电文中出现的字符的哈夫曼编码如下:"<<endl;show(&x, "",target3,e);show2(target,target3, last);cout << endl << endl;;decode(target3,last);
}

效果展示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/149936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【如何让你的建筑设计更高效】推荐7个3DMAX建筑设计的实用插件

3DMAX是创建具有复杂对象和照片级真实感材质的大型三维项目的绝佳工具。它有用于粒子模拟和参数化建模的内置工具&#xff0c;只要有足够的时间和练习&#xff0c;你就可以创建任何东西。然而&#xff0c;总有改进的余地。许多第三方开发人员已经发布了自己的扩展&#xff0c;也…

YOLOv8优化策略:轻量级Backbone改进 | VanillaNet极简神经网络模型 | 华为诺亚2023

🚀🚀🚀本文改进:一种极简的神经网络模型 VanillaNet,支持vanillanet_5, vanillanet_6, vanillanet_7, vanillanet_8, vanillanet_9, vanillanet_10, vanillanet_11等版本 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,…

Spring高级bean的实例化方法

bean的实例化方法 构造方法 实例化bean第一种&#xff1a;使用默认无参构造函数(常用) 第二种创建bean实例&#xff1a;静态工厂实例化&#xff08;了解&#xff09; 第三种&#xff1a;实例工厂&#xff08;了解&#xff09;与FactoryBean&#xff08;实用&#xff09;

AQS原理

文章目录 1. 简介2. 基于AQS实现自定义锁 1. 简介 AQS时AbstractQueueSynchronizer&#xff0c;是阻塞式锁的同步器工具的框架。AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器。特点如下&#xff1a; 用State属性来表示资源的状态…

JVM判断对象是否存活之引用计数法、可达性分析

目录 前言 引用计数法 概念 优点 缺点 可达性分析 概念 缺点&#xff1a; 扩展&#xff1a; 1.GC Roots 概念 2.STW (Stop the world) 前言 JVM有两种算法来判断对象是否存活&#xff0c;分别是引用计数法和可达性分析算法&#xff0c;针对可达性分析算法STW时间长、…

【MySQL】_JDBC

目录 1. JDBC原理 2. 导入JDBC驱动包 3. 编写JDBC代码实现Insert 3.1 创建并初始化一个数据源 3.2 和数据库服务器建立连接 3.3 构造SQL语句 3.4 执行SQL语句 3.5 释放必要的资源 4. JDBC代码的优化 4.1 从控制台输入 4.2 避免SQL注入的SQL语句 5. 编写JDBC代码实现…

第二次授课内容

1、第二次课程内容讲评。 服务枚举 服务的二进制的路径获取这块&#xff0c;对于代理执行这种类型的服务&#xff0c;枚举结果这是不正确&#xff0c;&#xff08;同步读取文件可能导致&#xff0c;文件打开失败。服务可能带有比较高的权限&#xff1b;独享式打开的时候&…

ArrayList中放的是一个对象,如何同时根据对象中的三个字段对List进行排序

import java.util.ArrayList; import java.util.Collections; import java.util.Comparator;public class YourObject {private int field1;private String field2;private double field3;// 构造函数和其他代码public int getField1() {return field1;}public String getField…

3298:练50.1 查分程序《信息学奥赛一本通编程启蒙(C++版)》

3298&#xff1a;练50.1 查分程序《信息学奥赛一本通编程启蒙&#xff08;C版&#xff09;》 【题目描述】 尼克&#xff0c;格莱尔等5位同学进行了一次信息学测试&#xff0c;试编一程序&#xff0c;实现查分功能。先输入成绩&#xff0c;然后输入学号输入相应的成绩。 【输…

〖大前端 - 基础入门三大核心之JS篇㊲〗- DOM改变元素节点的css样式、HTML属性

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

Python数据分析实战① Python实现数据可视化

文章目录 一、数据可视化介绍二、matplotlib和pandas画图1.matplotlib简介和简单使用2.matplotlib常见作图类型3.使用pandas画图4.pandas中绘图与matplotlib结合使用 三、订单数据分析展示四、Titanic灾难数据分析显示 一、数据可视化介绍 数据可视化是指将数据放在可视环境中…

.Net中Redis的基本使用

前言 Redis可以用来存储、缓存和消息传递。它具有高性能、持久化、高可用性、扩展性和灵活性等特点&#xff0c;尤其适用于处理高并发业务和大量数据量的系统&#xff0c;它支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、有序集合等。 Redis的使用 安装包Ser…

wpf devexpress 排序、分组、过滤数据

这个教程示范在GridControl如何排序数据&#xff0c;分组数据给一个行创建一个过滤。这个教程基于前一个教程。 排序数据 可以使用GridControl 排序数据。这个例子如下过滤数据对于Order Date 和 Customer Id 行&#xff1a; 1、对于Order Date 和 Customer Id 行指定Colum…

代码随想录算法训练营Day 55 || 583. 两个字符串的删除操作、72. 编辑距离

583. 两个字符串的删除操作 力扣题目链接(opens new window) 给定两个单词 word1 和 word2&#xff0c;找到使得 word1 和 word2 相同所需的最小步数&#xff0c;每步可以删除任意一个字符串中的一个字符。 示例&#xff1a; 输入: "sea", "eat"输出: …

Linux虚拟机中网络连接的三种方式

Linux 虚拟机中网络连接的三种方式 先假设一个场景&#xff0c;在教室中有三个人&#xff1a;张三、李四和王五&#xff08;这三个人每人有一台主机&#xff09;&#xff0c;他们三个同处于一个网段中&#xff08;192.169.0.XX&#xff09;&#xff0c;也就是说他们三个之间可…

深度学习_13_YOLO_图片切片及维度复原

需求&#xff1a; 在对获取的图片进行识别的时候&#xff0c;如果想减少不必要因素的干扰&#xff0c;将图片切割只对有更多特征信息的部分带入模型识别&#xff0c;而剩余有较多干扰因素的部分舍弃&#xff0c;这就是图片切割的目的&#xff0c;但是又由于模型对图片的维度有较…

计数排序.

一.定义&#xff1a; 计数排序&#xff08;Counting Sort&#xff09;是一种非比较性质的排序算法&#xff0c;其时间复杂度为O(nk)&#xff08;其中n为待排序的元素个数&#xff0c;k为不同值的个数&#xff09;。这意味着在数据值范围不大并且离散分布的情况下&#xff0c;规…

Spring Cloud学习(十)【Elasticsearch搜索功能 分布式搜索引擎02】

文章目录 DSL查询文档DSL查询分类全文检索查询精准查询地理坐标查询组合查询相关性算分Function Score Query复合查询 Boolean Query 搜索结果处理排序分页高亮 RestClient查询文档快速入门match查询精确查询复合查询排序、分页、高亮 黑马旅游案例 DSL查询文档 DSL查询分类 …

QT day3作业

1.思维导图 2、 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密…

Oracle 11g 多数据库环境下的TDE设置

19c的TDE wallet的设置是在数据库中设置的&#xff0c;也就是粒度为数据库&#xff0c;因此不会有冲突。 而11g的设置是在sqlnet.ora中&#xff0c;因此有可能产生冲突。 这里先将一个重要概念&#xff0c;按照文档的说法&#xff0c;wallet是不能被数据库共享的。 If there …