#include <iostream>
#include <stdlib.h>
//#include <algorithm> using namespace std; void stringZip( const char* pInputStr, long lInputLen, char* pOutputStr )
{
if( !pInputStr || lInputLen <= 1 || !pOutputStr )
return;
memset( pOutputStr, 0, lInputLen ); char cValue = *pInputStr;//重复字母对比值
long lCount = 0;//单一字符重复字母个数
int iIndex = 0;//pInputStr迭代位置
int iCur = 0;//pOutputStr当前指针偏移
int iNumLen = 0;//压缩字母的个数长度
char buf[16];//字母长度缓存 while( lInputLen-- )
{
if( cValue == *( pInputStr + iIndex++ ) )
{//遇到重复字符
lCount++;//
}
else
{
if( lCount > 1 )
{//重复字符
memset( buf, 0, 16 );
itoa( lCount, buf, 10 );
strcat( pOutputStr, buf );
iNumLen = strlen( buf );
} iCur += iNumLen;
*( pOutputStr + iCur ) = cValue;//append字符
iCur++; cValue = *(pInputStr + iIndex - 1);//取下一个待比较的字符 //重新计算位置
iIndex--;
lInputLen++; //重置计数器
iNumLen = 0;
lCount = 0;
}
}
} char* stringUnzip( const char* pStrIn )
{//
if( !pStrIn || !strlen( pStrIn ) )
return NULL; long lLen = strlen( pStrIn );
const int INCREMENT = 1024; //先将结果字符串设置为输入字符串的5倍大小
long lCurNums = 5 * lLen * sizeof( char );
char* pStrOut = (char*)malloc( lCurNums ); if( !pStrOut )
return NULL; memset( pStrOut, 0, lCurNums ); long lNum = 0;//重复字母个数
int iNumLen = 0;//重复字母长度
int iCur = 0;//结果集当前指针偏移
char numBuf[16];//用于计算数字长度
char cValue; //临时字符值
const long constLen = lLen;
long lIndex = constLen - lLen;//pStrIn的字符串偏移值 int i;
while( lIndex < constLen )
{
lIndex = constLen - lLen;// lNum = atoi( ( pStrIn + lIndex ));//字符个数 if( lNum > 0 )
{//字符个大于1
if( iCur + lNum >= lCurNums -1 )
{//空间不足
lCurNums += INCREMENT; pStrOut = (char*)realloc( pStrOut, lCurNums ); if( !pStrOut )
return NULL;
} memset( numBuf, 0, 16 );
itoa( lNum, numBuf, 10 ); iNumLen = strlen( numBuf );//取数字长度
cValue = *( pStrIn + lIndex + iNumLen );//取压缩的字符 for( i = 0; i < lNum; i++ )//还原压缩的字符
{
*( pStrOut + iCur++ ) = cValue;
} }
else
{//未压缩的单一字符
if( iCur >= lCurNums -1 )
{//空间不足
lCurNums += INCREMENT; pStrOut = (char*)realloc( pStrOut, lCurNums ); if( !pStrOut )
return NULL;
} *(pStrOut + iCur++ ) = *( pStrIn + lIndex + iNumLen );
} lLen = lLen - iNumLen - 1;//计算偏移值
iNumLen = 0; } return pStrOut; } int main( int argc, char* argv[] )
{
char* pInStr = "aaaabasdfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccddddeeeadfaadfa";
int iLen = strlen( pInStr ) + 1; char* pOutStr = (char*)malloc( iLen );
memset( pOutStr, 0, iLen ); //压缩字符
stringZip( pInStr, iLen, pOutStr );
puts( pOutStr ); //还原压缩的字符
char* pUnzipStr = stringUnzip( pOutStr );
puts( pUnzipStr );     free( pUnzipStr );
pUnzipStr = NULL; return 0;
}

C字符串压缩算法的更多相关文章

  1. JustOj 1415: 字符串解压

    题目描述 豆豆非常调皮,总喜欢把一样的东西摆在一起,然后用神奇的猫爪功把他们揉成一团. 比如一堆A,就会被揉成个数+A. 这就是豆豆的字符串压缩算法了. 比如给豆豆一个字符串:ABBCCCDDDDEE ...

  2. 字符串解压缩类库(zip、GZIP、QuickLz、snappy、lzf、jzlib)介绍

    1.ZIP. GZIP  计算机文件压缩算法,JDK中java.util.zip.*中实现.主要包括ZipInputStream/ ZipOutputStream.GZipInputStream/Zi ...

  3. 字符串压缩(一)之ZSTD

    前言 最近项目上有大量的字符串数据需要存储到内存,并且需要储存至一定时间,于是自然而然的想到了使用字符串压缩算法对"源串"进行压缩存储.由此触发了对一些优秀压缩算法的调研. 字符串 ...

  4. 深入剖析Redis RDN持久化机制

    rdb是redis保存内存数据到磁盘数据的其中一种方式(另一种是AOF).Rdb的主要原理就是在某个时间点把内存中的所有数据的快照保存一份到磁盘上.在条件达到时通过fork一个子进程把内存中的数据写到 ...

  5. ZIP压缩算法详细分析及解压实例解释

    最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...

  6. .NET基础拾遗(3)字符串、集合和流

    Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...

  7. LZ77压缩算法编码原理详解(结合图片和简单代码)

    前言 LZ77算法是无损压缩算法,由以色列人Abraham Lempel发表于1977年.LZ77是典型的基于字典的压缩算法,现在很多压缩技术都是基于LZ77.鉴于其在数据压缩领域的地位,本文将结合图 ...

  8. Java 压缩字符串

    1.引言 最近在做项目中,平台提供一个http服务给其他系统调用,然后我接收到其他系统的json格式的报文后去解析,然后用拿到的数据去调用corba服务,我再把corba的返回值封装完成json字符串 ...

  9. C# 压缩与解压字符串(面试题)

    /* * 题目:压缩字符串.如“abbcccddddeef”,压缩成“a1b2c3d4e2f1” * 解题: 这个题目也是面试常见的题目.看似很简单,其实暗藏杀机.一般的想法就是,一边遍历,一边计数, ...

随机推荐

  1. make menuconfig 出错

    运行 #make menuconfig HOSTLD scripts/kconfig/mconf scripts/kconfig/mconf.o: In function `main': mconf. ...

  2. hdu 1299 Diophantus of Alexandria

    1/x + 1/y = 1/n 1<=n<=10^9给你 n 求符合要求的x,y有多少对 x<=y// 首先 x>n 那么设 x=n+m 那么 1/y= 1/n - 1/(n+ ...

  3. MySQL基础之第2章 Windows平台下安装与配置MySQL

    2.1.msi安装包 2.1.1.安装 特别要注意的是,安装前要删除原来的my.ini和原来的data目录,改名也行,不然在最后一步会“apply security settings”报个1045错误 ...

  4. git学习一

    一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...

  5. 翻译【ElasticSearch Server】第一章:开始使用ElasticSearch集群(1)

    我们要做的第一件事是安装ElasticSearch.对于多数应用程序,您开始安装和配置,通常忘记这些步骤的重要性,直到发生了糟糕的事情.这章我们将广泛关注ElasticSearch的这部分.请注意本章 ...

  6. 《Python 学习手册4th》 第十二章 if测试和语法规则

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...

  7. BBED的安装

    BBED是Block Browser EDitor的缩写,只有linux/unix版本,没有windows版本. 11g中默认是不带bbed的,如果要使用,可以在10g中拷贝过来,然后再进行编译使用. ...

  8. 【暑假】[基本数据结构]根据in_order与post_order构树

    Tree Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Des ...

  9. Cloudera CDH5 部署实战指南(离线安装)

    配置软件源服务器 1.安装createreporpm -ivh deltarpm-3.5-0.5.20090913git.el6.x86_64.rpm rpm -ivh python-deltarpm ...

  10. [算法] 选择排序 Selection sort

    选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然 ...