C++实现lzw编码的简单方案

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

#includeiostream.h#includestring.h#includestdlib.h#includestdio.hstructstringcode{charstring[50];intlen;};intISINDic(stringcodestr,stringcodedict[50],intlen2)//判断出字符串若在,并返回字典中的位置{for(inti=0;ilen2;i++)if(dict[i].len==str.len&&strnicmp(dict[i].string,str.string,str.len)==0)returni+1;return0;}//判断字符是否在字典中intISINDic(charstr,stringcodedict[50],intlen2){for(inti=1;i=len2;i++){if(dict[i-1].len==1&&str==dict[i-1].string[0])return1;}return0;}voidmain(){intchoice,yima[50];inti,j,k,len2=0,m;stringcodezifudata,dict[50],profix;for(i=0;i50;i++){zifudata.string[i]=0;}for(i=0;i50;i++){dict[i].len=0;}for(i=0;i50;i++){yima[i]=0;}cout_____________________LZW算法__________________________endl;cout++++++++++++++++++++++++++++++++++++++++++++++++++++++endl;cout学号:0811100211———————姓名:樊军———————endl;cout++++++++++++++++++++++++++++++++++++++++++++++++++++++endl;cout请输入所需的功能1:编码2:译码endl;cinchoice;if(choice==1)//该段实现编码————————————————————————{coutpleaseinputthestringstreamendl;cinzifudata.string;zifudata.len=strlen(zifudata.string);dict[0].string[0]=zifudata.string[0];dict[0].len=1;intlen2=1;for(i=1;izifudata.len;i++)//此处把单个的字符压入字典{if(ISINDic(zifudata.string[i],dict,len2)==0){dict[len2].len++;dict[len2].string[0]=zifudata.string[i];len2++;}}//此处将不断循环以判断和添加字典中//编码profix.len=0;j=0;k=1;while(jzifudata.len)//1、分析字符串流,从词典中寻找最长匹配串Profix(Profix在表中,而ProfixC不在表中。Profix为进行编码字符串,C为Profix后的第一个字符)。{stringcodeprofixc;//2、保存Profix对应的词典码字(索引)到yima[50]。charc;//3、将ProfixC放入词典,词典长度+1c=zifudata.string[j];profixc.len=profix.len+1;for(m=0;mprofix.len;m++){profixc.string[m]=profix.string[m];}profixc.string[profixc.len-1]=c;if(ISINDic(profixc,dict,len2)!=0){profix.len++;profix.string[profix.len-1]=profixc.string[profixc.len-1];j++;}else{yima[k]=ISINDic(profix,dict,len2);k++;dict[len2].len=profixc.len;for(m=0;mprofixc.len;m++){dict[len2].string[m]=profixc.string[m];}len2++;profix.len=1;profix.string[0]=zifudata.string[j];if(j+1=zifudata.len){yima[k]=ISINDic(profix,dict,len2);k++;}j++;}}coutDICTIONARY+++++++++++++++++++++++++++++++++++++++endl;for(j=0;jlen2;j++){cout第j+1个;for(i=0;idict[j].len;i++)coutdict[j].string[i];coutendl;}coutTRANSLATE++++++++++++++++++++++++++++++++++++++=endl;j=1;for(j=1;jk;j++)cout第j个yima[j]endl;}else//该段实现译码——————————————————————————————-{for(i=0;i50;i++){zifudata.string[i]=0;}//初始化for(i=0;i50;i++){dict[i].len=0;}for(i=0;i50;i++){yima[i]=0;}intlen2=0;intCodelength=0;stringcodepw,cw;pw.len=0;cw.len=0;zifudata.len=0;if(choice==2){cout请输入字符根缀表(不需要符号隔开):;chars[20];cins;ints_length=strlen(s);for(i=0;is_length;i++){dict[i].string[0]=s[i];dict[i].len=1;len2++;}//压入可能的所有的单字cout请输入解码数字的个数:;cinCodelength;cout请输入码字(数字之间用Enter隔开):endl;for(i=0;iCodelength;i++)cinyima[i];intp=0;//以p控制码字的向后移动intnum=yima[0];zifudata.string[0]=dict[num-1].string[0];//zifudata.len++;cw.string[0]=zifudata.string[0];//cw.len=1;pw=cw;//第一个字符输出while(++pCodelength){num=yima[p];if(num=len2)//字典中存在数字序号对应字符,即在词典中有{cw=dict[num-1];//①保存码字对应的字典内容到字符串for(inti=0;idict[num-1].len;i++)//②当前字符为cw的第一个字符{zifudata.len++;//③将码字对应的字典内容+当前字符输入到字典zifudata.string[zifudata.len-1]=dict[num-1].string[i];}stringcodepc;pc.len=pw.len+1;for(i=0;ipw.len;i++)pc.string[i]=pw.string[i];pc.string[pc.len-1]=cw.string[0];len2++;dict[len2-1]=pc;pw=cw;}elseif(num==len2+1)//字典中没有{stringcodepc;//①将pc=pw+cwpc.len=pw.len+1;//②输出到字符串for(i=0;ipw.len;i++)//③并添加到字典pc.string[i]=pw.string[i];pc.string[pc.len-1]=cw.string[0];cw=pc;for(inti=0;icw.len;i++){zifudata.len++;zifudata.string[zifudata.len-1]=cw.string[i];}pw=cw;}elsecout输入的数字序列有误,无法解码……endlendl;}cout字典为:endl;//输出字典for(i=0;ilen2;i++){couti+1:;for(intj=0;jdict[i].len;j++)coutdict[i].string[j];coutendl;}coutendl;coutLZW解压缩后字符串为:endl;//输出解压缩码for(i=0;izifudata.len;i++)coutzifudata.string[i];coutendl;}else{coutwronginputendl;exit(0);}}}

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功