C++實(shí)現(xiàn)哈夫曼編碼
本文實(shí)例為大家分享了C++實(shí)現(xiàn)哈夫曼編碼的具體代碼,供大家參考,具體內(nèi)容如下
#include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; int Max = 300; class tree{ public: char s; int num; tree *left; tree *right; tree(){ s= '!'; num = 0; left = 0; right = 0; } tree(char a,int n,tree* p1,tree* p2){ s = a; num = n; left = p1; right = p2; } }; vector<tree *> open; /********************************* **中序遍歷輸出各節(jié)點(diǎn)及其哈夫曼編碼 *********************************/ void inorder(tree *t,string s){ if(t != 0){ inorder(t->left,s+'0'); if(t->s != '!') cout<<t->s<<":"<<s<<endl; inorder(t->right,s+'1'); } } int main(){ int a[Max]; for(int i = 0;i < Max;i++) a[i] = 0; //初始化數(shù)組 string s; cout<<"請(qǐng)輸入字符串:"; cin>>s; vector<char> v; vector<char>::iterator vit; for(int i = 0;i < s.length();i ++){ a[s[i]]++; //確定每個(gè)字符出現(xiàn)的次數(shù)(頻率) vit = find(v.begin(),v.end(),s[i]); if(vit == v.end()) //相同的字符只保留一個(gè) v.push_back(s[i]); } for(int i = 0;i < v.size();i ++){ tree *n = new tree(); n->s = v[i]; n->num = a[v[i]]; open.push_back(n); //存入open表中 } /************************ ** **構(gòu)造哈夫曼樹(shù) ** *************************/ tree *root; while(open.size() != 1){ tree *min1,*min2; //min1,min2是當(dāng)前open表中num值最小的節(jié)點(diǎn) int sit1,sit2; min1 = open.front(); sit1 = 0; for(int i = 0;i < open.size();i++){ if(open[i]->num < min1->num){ min1 = open[i]; sit1 = i; } } open.erase(open.begin()+sit1); min2 = open.front(); sit2 = 0; for(int i = 0;i < open.size();i++){ if(open[i]->num < min2->num){ min2 = open[i]; sit2 = i; } } open.erase(open.begin()+sit2); tree *t = new tree('!',min1->num + min2->num,min1,min2); //構(gòu)造新節(jié)點(diǎn),左右指針指min1和min2 open.push_back(t); //存入open表中 root = t; } cout<<"它的哈夫曼編碼為:"<<endl; string s1 = ""; inorder(root,s1); return 0; }```
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言深入淺出講解直接插入排序算法的實(shí)現(xiàn)
插入排序也是最簡(jiǎn)單的一類排序方法,我今天介紹的也是插入排序里最直觀且淺顯易懂的直接插入排序。對(duì)這個(gè)很簡(jiǎn)單的排序,記得當(dāng)時(shí)也是花了近兩個(gè)晚上才搞懂它的原理的,接下來(lái)就來(lái)介紹一下2022-05-05C++實(shí)現(xiàn)浮點(diǎn)數(shù)精確加法
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)浮點(diǎn)數(shù)精確加法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05c++ 預(yù)處理之正整型實(shí)現(xiàn)方法
這篇文章主要介紹了c++ 預(yù)處理之正整型實(shí)現(xiàn)方法,需要的朋友可以參考下2017-07-07Qt實(shí)現(xiàn)Slider滑塊條組件的示例代碼
在Qt中我們可以通過(guò)拖拽的方式將不同組件放到指定的位置,本文主要介紹了Qt實(shí)現(xiàn)Slider滑塊條組件的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12C語(yǔ)言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn)
這篇文章主要介紹了C語(yǔ)言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09C++設(shè)計(jì)模式編程中proxy代理模式的使用實(shí)例
這篇文章主要介紹了C++設(shè)計(jì)模式編程中proxy代理模式的使用實(shí)例解析,代理模式可以被歸類為結(jié)構(gòu)型的設(shè)計(jì)模式,代理模式主張為對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn),需要的朋友可以參考下2016-03-03C++實(shí)現(xiàn)二叉樹(shù)及堆的示例代碼
這篇文章主要介紹了C++實(shí)現(xiàn)二叉樹(shù)及堆的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04