/********************************************
--程序描述: 数据结构huffman编码的实现
--修改日期: 2009.5.31
--修改人: 吴强
--修改原因: 从前写的程序不够规范
--输入要求: 输入要编码的.txt文件名
********************************************/
#include
#include
#include
const int N=26;
const int M=2*N-1;
const int Max=10000;
typedef struct
{
char c;
int w;
int lint;
int rint;
}NODE;
NODE htree[M];
//把文件的操作定义成一个类
class Cfile
{
private:
char *fname;
FILE *fp;
public:
void Openfile();
void sort();
void Closefile()
{
fclose(fp);
delete[] fname;
}
};
//打开指定文件,并记录各字母(大小写异同)出现次数
void Cfile::Openfile()
{
fname=new char[50];
cin>> fname;
if ( ( fp=fopen(fname,"r") )==NULL )
{
cout<<"openfile error";
exit(0);
}
while ( !feof(fp) )
{
int k;
char ch=fgetc(fp);
//如果不是大小写字母就跳过
if ( (ch< 'a' || ch> 'z') && (ch< 'A' || ch> 'Z') )
{
continue;
}
if (ch>= 'A' && ch<= 'Z')
{
ch+=32; //小写换成大写
}
int i=0;
int j=N-1;
while ( i<= j ) //二分查找,记录各字母权值
{
k=(i+j)/2;
if (ch < htree[k].c)
{
j=k-1;
}
else if (ch > htree[k].c)
{
i=k+1;
}
else
{
htree[k].w+=1;
break;
}
}
}
}
void Cfile::sort()
{
NODE jh;
//冒泡法按权值大小排序
for ( int i=0; i< N; i++ )
{
int k=0;
for ( int j=0; j< N-i+1; j++ )
{
if ( htree[j].w> htree[j+1].w )
{
jh=htree[j];
htree[j]=htree[j+1];
htree[j+1]=jh;
k=1;
}
}
if (!k)
{
break;
}
}
}
//定义栈
class st
{
private:
int stack[N];
int top;
public:
st();
void Push(int);
void Pop();
void PutStack();
};
st::st()
{
for ( int i=0; i< N; i++ )
{
stack[i]=Max;
}
top=-1;
}
void st::Push(int x)
{
stack[++top]=x;
}
void st::Pop()
{
stack[top]=Max;
top--;
}
void st::PutStack()
{
for ( int i=0; i<= top; i++ )
{
cout<< stack[i];
}
cout<< endl;
}
class huffman
{
private:
int l;
public:
huffman()
{
l=0;
}
void Create_ht();
void TraverseTree(int);
public:
st code;
};
void huffman::Create_ht()
{
int i=0;
int j=N;
int k=N;
int min_1;
int min_2;
while ( j< M )
{
if ( i< N && htree[i].w<= htree[j].w )
{
min_1=i++;
if ( i< N && htree[i].w<= htree[j].w )
{
min_2=i++;
}
else
{
min_2=j++;
}
}
else
{
min_1=j++;
if ( i< N && htree[i].w<= htree[j].w )
{
min_2=i++;
}
else
{
min_2=j++;
}
}
htree[k].w=htree[min_1].w+htree[min_2].w;
htree[k].lint=min_1;
htree[k].rint=min_2;
k++;
}
}
void huffman::TraverseTree(int root)
{
if ( htree[root].rint!=-1 )
{
code.Push(0);
TraverseTree(htree[root].rint);
code.Pop();
code.Push(1);
TraverseTree(htree[root].lint);
code.Pop();
}
else
{
cout<< l++;
cout<< " "<< htree[root].c<< " ";
code.PutStack();
cout<< endl;
}
}
void main()
{
inline void Init_ht();
Init_ht();
Cfile ff;
ff.Openfile();
ff.sort();
ff.Closefile();
huffman ht;
ht.Create_ht();
cout<< "huffman编码:"<< endl;
ht.TraverseTree(M-1);
cout<< "统计: "<< endl;
for ( int i=0; i< N; i++)
{
cout<< " "<< htree[i].c<< " "<< htree[i].w<< "个"<< endl;
}
}
void Init_ht()
{
for ( int i=0; i< N; i++ )
{
htree[i].c='a'+i;
htree[i].w=0;
htree[i].lint=-1;
htree[i].rint=-1;
}
for ( i=N; i< M; i++)
{
htree[i].c='#';
htree[i].w=Max;
htree[i].lint=-1;
htree[i].rint=-1;
}
}
huffman编码
最新推荐文章于 2021-05-20 18:00:47 发布
1000

被折叠的 条评论
为什么被折叠?



