【手打】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;
}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 新手小白学JAVA IO流 File 字节流 字符流

    新手小白学JAVA IO流 File 字节流 字符流IO简介1流Stream在学习IO流之前,我们首先需要学习的概念就是Stream流为了方便理解,我们可以把数据的读写操作抽象成数据在”管道”中流动,但需注意:1.流只能单方向流动2.输入流用来读取→in3.输出流用来写出→out4.数据只能从头到尾顺序的读写一次所以以程序的角度来思考,In/out相对于程序而言的输入(读取)/输出(写出)的过程.2IO流的继承结构在java中,根据处理的数据单位不同,可以把流分为字节流和字符流字节流:针对二进制文件字符流:针对

  • R语言介绍

    R语言简介R语言是一种为统计计算和图形显示而设计的语言环境,是贝尔实验室(BellLaboratories)的RickBecker、JohnChambers和AllanWilks开发的S语言

    2021年12月26日
  • java开发webservice的几种方式「建议收藏」

    java开发webservice的几种方式「建议收藏」webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录。1.Axis2方式Axis是apache下一个开源的webservice开发

  • hive sql 窗口函数

    hive sql 窗口函数

    2021年11月27日
  • idea 快捷键ctrl+shift+f失效的解决方案

    idea 快捷键ctrl+shift+f失效的解决方案1.刚换了新环境,新装的idea的快捷键ctrl+shift+f按了没反应,于是想到快捷键冲突了,马上查看qq和搜狗输入法的快捷键:这里是将搜狗输入法的简繁切换快捷键换下,我是换成了ctrl+shift+a2.这里还有第二种方法,就是idea自定义快捷键的设置步骤如下图所示:注意下面是按键输入我这里是用的ctrl+shift+alt+0来设置的,当…

  • hashmap源码深度解析_redis的hash数据结构

    hashmap源码深度解析_redis的hash数据结构HashMap可以说是Java中最常用的集合类框架之一,是Java语言中非常典型的数据结构,我们总会在不经意间用到它,很大程度上方便了我们日常开发。在很多Java的笔试题中也会问到,最常见的,“HashMap和HashTable有什么区别?”,这也不是三言两语能说清楚的,这种笔试题就是考察你来笔试之前有没有复习功课,随便来个快餐式的复习就能给出答案。

发表回复

您的电子邮箱地址不会被公开。

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