LZW编码编程实现(C++版)Word格式.doc
《LZW编码编程实现(C++版)Word格式.doc》由会员分享,可在线阅读,更多相关《LZW编码编程实现(C++版)Word格式.doc(6页珍藏版)》请在冰点文库上搜索。
![LZW编码编程实现(C++版)Word格式.doc](https://file1.bingdoc.com/fileroot1/2023-4/29/78f43585-4181-45ea-aa6f-4e42085841c0/78f43585-4181-45ea-aa6f-4e42085841c01.gif)
输入A
此时,A在表中,而AB不在表中,则输出A对应的码字1,同时将AB写入表中,此时表为
4AB
编码输出为1(A已编码)
第二步,输入B,B在词典中,而BB不在词典中,则输出2,将BB写入表中,此时表为
5BB
编码输出为12(AB已经编码)
....
2.解码
根缀表为
定义如下变量
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放入表中,此时表为
四、实验情况及分析
编码解码
错误提示
附:
源代码
#include<
iostream>
string>
iomanip>
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++)//其余为空
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]='
stringk=t;
if(k=="
)//为空,字符串结束
"
find(w);
break;
//退出for循环,编码结束
if(find(w+k)>
-1)
w=w+k;
i++;
else
stringwk=w+k;
dic[j++]=wk;
w=k;
endl;
for(i=0;
j;
setw(45)<
i+1<
setw(12)<
dic[i]<
voiddecode(intc[])
intpw,cw;
cw=c[0];
intj=2;
\n译码为:
dic[cw-1];
n-1;
pw=cw;
cw=c[i+1];
if(cw<
=j+1)
t[0]=dic[cw-1][0];
j++;
dic[j]=dic[pw-1]+k;
t[0]=dic[pw-1][0];
j+1;
voidmain()
stringstr;
while
(1)
\n\n\ta.编码\tb.译码\n\n"
请选择:
charcha;
cin>
>
cha;
if(cha=='
a'
\n输入要编码的字符串(由a、b、c组成):
str;
code(str);
b'
intc[30];
\n消息序列长度是:
n;
\n消息码字依次是:
c[i];
decode(c);
else{cout<
输入错误!