LZW编码编程实现(C++版).doc
《LZW编码编程实现(C++版).doc》由会员分享,可在线阅读,更多相关《LZW编码编程实现(C++版).doc(6页珍藏版)》请在冰豆网上搜索。
LZW编码的编程和实现
一、实验目的
编写源程序,实现LZW的编码和解码
二、实验要求
1.编码输入若干字母(如abbababac),输出相应的编码
2.解码输入若干数字(如122473),输出相应的字母
三、编程思想
1.编码
根缀表已知
1A
2B
3C
编码
分析字符串流,从词典中寻找最长匹配串,即字符串P在词典中,而字符串P+后一个字符C不在词典中
此时,输出P对应的码字,将P+C放入词典中。
如第一步:
输入A
此时,A在表中,而AB不在表中,则输出A对应的码字1,同时将AB写入表中,此时表为
1A
2B
3C
4AB
编码输出为1(A已编码)
第二步,输入B,B在词典中,而BB不在词典中,则输出2,将BB写入表中,此时表为
1A
2B
3C
4AB
5BB
编码输出为12(AB已经编码)
....
2.解码
根缀表为
1A
2B
3C
定义如下变量
StringP:
前一步码字流
pW:
StringP的第一个字符
StringC:
当前的码字流
cW:
StringC的第一个字符
第一步
输出StringC并StringP=StringC
如:
1解码为A,则StringC=A
那么
输出A,并令StringP=A
---------------------------------------------------------------------------
第二步
1.解码得到StringC,并输出StringC
2.将StringP+cW放入词典(如果当前码字不在词典中,则将StringP+cP放入词典中)
3.StringP=StringC
如:
第二步要解码为2,解码为B,则StringC=B,输出B(此时StringP=A)
将StringP+cW放入表中,即将AB放入表中,此时表为
1A
2B
3C
4AB
四、实验情况及分析
编码解码
错误提示
附:
源代码
#include
#include
#include
usingnamespacestd;
stringdic[30];
intn;
intfind(strings)//字典中寻找,返回序号
{
inttemp=-1;
for(inti=0;i<30;i++)
{
if(dic[i]==s)temp=i+1;
}
returntemp;
}
voidinit()//字典初始化
{
dic[0]="a";
dic[1]="b";
dic[2]="c";//字根为a,b,c
for(inti=3;i<30;i++)//其余为空
{
dic[i]="";
}
}
voidcode(stringstr)
{
init();//初始化
chartemp[2];
temp[0]=str[0];//取第一个字符
temp[1]='\0';
stringw=temp;
inti=1;
intj=3;//目前字典存储的最后一个位置
cout<<"\n编码为:
";
for(;;)
{
chart[2];
t[0]=str[i];//取下一字符
t[1]='\0';
stringk=t;
if(k=="")//为空,字符串结束
{
cout<<""<break;//退出for循环,编码结束
}
if(find(w+k)>-1)
{
w=w+k;
i++;
}
else
{
cout<<""<stringwk=w+k;
dic[j++]=wk;
w=k;
i++;
}
}
cout<for(i=0;i{
cout<}
cout<}
voiddecode(intc[])
{
init();
intpw,cw;
cw=c[0];
intj=2;
cout<<"\n译码为:
";
cout<for(inti=0;i{
pw=cw;
cw=c[i+1];
if(cw<=j+1)
{
cout<chart[2];
t[0]=dic[cw-1][0];
t[1]='\0';
stringk=t;
j++;
dic[j]=dic[pw-1]+k;
}
else
{
chart[2];
t[0]=dic[pw-1][0];
t[1]='\0';
stringk=t;
j++;
dic[j]=dic[pw-1]+k;
cout<}
}
cout<for(i=0;i{
cout<}
cout<}
voidmain()
{
stringstr;
while
(1)
{
cout<<"\n\n\ta.编码\tb.译码\n\n";
cout<<"请选择:
";
charcha;
cin>>cha;
if(cha=='a')
{
cout<<"\n输入要编码的字符串(由a、b、c组成):
";
cin>>str;
code(str);
}
if(cha=='b')
{
intc[30];
cout<<"\n消息序列长度是:
";
cin>>n;
cout<<"\n消息码字依次是:
";
for(inti=0;i{
cin>>c[i];
}
decode(c);
}
else{cout<<"输入错误!
"<break;}
}
}