【手打】LZW编码的C/C++实现「建议收藏」

【手打】LZW编码的C/C++实现

大家好,又见面了,我是全栈君。

LZW编码通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩。 LZW压缩算法是Unisys的专利,有效期到2003年,所以相关算法大多也已过期。

本代码只完毕了LZW的编码与解码算法功能,相对网上找到的非常多代码而言较为简(cai)单(bi)。了解struct && 会递归就可以,算是长处吧。

#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

struct Node{
	int pre;					//前缀单词相应码字
	char c;						//当前字符
}KDA[65535];

int cnt,P,Q;
char W,V;

void Init(){					//前256个字典由相应ASCII码生成
	for(int i = 0;i < 256; i ++){
		KDA[i].pre = -1;
		KDA[i].c = i;
	}
	cnt = 256;
	P = -1;
}

void Out(int x){                            //递归输出码字相应单词,首位另存用于建立字典
    if(KDA[x].pre != -1){
        Out(KDA[x].pre);
    }
    else {
        V = KDA[x].c;
    }
    printf("%c",KDA[x].c);
}

void Search(){
    int flag = 0;
	for(int i = 0;i < cnt;i ++){
		if(KDA[i].pre == P && KDA[i].c == W){//字典已存在则更新前缀相应码字
			P = i;
			flag = 1;
        }
	}
	if(!flag){                  //不存在则扩充字典,输出前缀相应码字并更新前缀单词
        KDA[cnt].pre = P;
        KDA[cnt].c = W;
        printf("%03X ",P);
        P = (int)W;
        cnt ++;
    }
}

void Research(){
    Out(Q);
    if(P != -1){                //假设前一位码字不为空,则将前一位相应单词作为前缀与本单词第一位合并作为新单词增加字典
        KDA[cnt].pre = P;
        KDA[cnt].c = V;
        cnt ++;
    }
}

void Compress(){<span style="white-space:pre">		</span>//编码过程
	Init();
	freopen("LZWin.txt","r",stdin);
	freopen("LZWch.txt","w",stdout);
	while((W = getchar()) && W != EOF){
		Search();
	}
	printf("%03X\n",P);
}

void Decompress(){<span style="white-space:pre">		</span>//解码过程
    Init();
    freopen("LZWch.txt","r",stdin);
	freopen("LZWout.txt","w",stdout);
	while(scanf("%03X",&Q)!= EOF){
		Research();
	}
}

int main(){
    Compress();
    Decompress();
	return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116153.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 两列向量正交有什么性质线性代数_线性代数正交化怎么算

    两列向量正交有什么性质线性代数_线性代数正交化怎么算正交向量  正交是垂直的令一种说法,两个向量正交意味着两个向量的夹角是90°。  这可以用直角三角形的三边解释:  当x和y正交时,二者的点积是0,反过来也一样。这个结论在n维空间也适用,当Rn空间内的两个向量x和向量y正交时:  如果x是零向量,xTy还是0,也意味着零向量和任意向量正交。正交子空间  正交性还可以推广到子空间,如果说一个子空间V和另一个子空间W…

    2025年5月26日
    0
  • 【Android动画】之Tween动画 (渐变、缩放、位移、旋转)

    【Android动画】之Tween动画 (渐变、缩放、位移、旋转)

    2021年12月7日
    60
  • 【ML】支持向量机(SVM)从入门到放弃再到掌握

    【ML】支持向量机(SVM)从入门到放弃再到掌握朋友,你通过各种不同的途经初次接触支持向量机(SVM)的时候,是不是会觉得这个东西耳熟能详,感觉大家都会,却唯独自己很难理解?每一次你的老板或者同仁让你讲解SVM的时候,你觉得你看过这么多资料,使用过这么多次,讲解应该没有问题,但偏偏在分享的时候结结巴巴,漏洞百出?每一次机器学习相关的面试在问到支持向量机(SVM)的时候,尽管你觉得你都准备好了,可是一次又一次败下阵来,以至于觉得问那些问题…

    2022年6月6日
    26
  • 注册豪礼

    注册豪礼

    2022年3月3日
    32
  • execute,executeQuery和executeUpdate的区别

    execute,executeQuery和executeUpdate的区别在jdbc中有3种执行sql的语句分别是execute,executeQuery和executeUpdateexecute执行增删改查操作execute返回的结果是个boolean型,当返回的是true的时候,表明有ResultSet结果集,通常是执行了select操作,当返回的是false时,通常是执行了insert、update、delete等操作。execute通常用于执行不明确的s

    2022年10月19日
    0
  • macbook电脑字体乱码了_mac系统语言改中文

    macbook电脑字体乱码了_mac系统语言改中文按照步骤来亲测可解决①如果没有~/.zshrc这个文件,那么新建一个该文件②新建命令:touch~/.zshrc③打开文件文件编辑vim~/.zshrc④修改内容并保存exportLANG=en_US.UTF-8⑤重启终端即可发现中文可以显示了……

    2022年10月30日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号