• 大小: 4KB
    文件类型: .cpp
    金币: 2
    下载: 0 次
    发布日期: 2024-02-04
  • 语言: C/C++
  • 标签: 数据结构  

资源简介

本人本科期间学习数据结构写的实验,内容如下 1、输入一段报文,例如: CAST CAST SAT AT A TASA 统计字符集合 { C, A, S, T },以及各个字符出现的频度(次数) W={ 2, 7, 4, 5 }。 2、建赫夫曼树,并输出各个字符的赫夫曼编码 3、输入编码01100……,能准确翻译成报文 4、要求有菜单。

资源截图

代码片段和文件信息

/*
**author: Happig
**time: 2020-5-10
**function:
1、输入一段报文,例如: 
    CAST  CAST  SAT  AT  A TASA
    统计字符集合 { C A S T },以及各个字符出现的频度(次数) W={ 2 7 4 5 }。
2、建赫夫曼树,并输出各个字符的赫夫曼编码
3、输入编码01100……,能准确翻译成报文
4、要求有菜单
*/
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn=2e5+10;

///采用数组模拟链表的方式存节点
struct node{
    int wid;  //w是节点权值id是对应数组下标
    char c;   //叶子节点为字母,其他节点为#
    char now;  //该节点上一条路径对应的01字符,0代表左子树,1代表右子树
    int falr;  //该节点的父节点和左右子节点

    node(){}
    node(int iint weightchar chint fatherint lchildint rchild){  //初始化函数
        id=iw=weightc=ch;
        fa=fatherl=lchildr=rchild;
    }

    bool operator < (const node &p) const {  //实现优先队列less容器的小根堆
        return w>=p.w;
    }
}a[maxn];

const char dic[]={‘C‘‘A‘‘S‘‘T‘};
const int num[]={2745};
priority_queue p;  //初始化用到的优先队列
string s;

int cnt;  //总的节点数

///初始化函数
void init(){
    while(!p.empty()) p.pop();  //优先队列清空
    for(int i=0;i<4;i++){    //根节点入队
        a[i]=node(inum[i]dic[i]000);
        p.push(a[i]);
    }
    cnt=4;  //此时队列的节点数
    while(p.size()>1){  //当队列只剩一个根节点时结束循环
        node u=p.top(); p.pop();
        node v=p.top(); p.pop();
        node nd=node(cntu.w+v.w00u.idv.id);  //得到新的节点
        a[u.id].fa=cnta[v.id].fa=cnt;   //更新节点数组的两子节点节点的父亲下标
        a[u.id].now=‘0‘a[v.id].now=‘1‘nd.now=nd.c=‘#‘;   //更新路径字符
        a[cnt++]=nd; //新增节点入字符数组
        p.push(nd);  //新增节点入队
    }
}

///查看哈夫曼树的结构
void Test(){
    for(int i=0;i        cout<        cout<

评论

共有 条评论