#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. 如何解决重启数据库时报ORA-01031无法登数据库

    问题现象:以无用户方式登录数据库,重启或关闭数据时,遇到下列问题: C:\Documents and Settings\xuzhengzhu>sqlplus /nolog SQL*Plus: R ...

  2. mysql教程-触发器

    触发器 1. mysql触发器 情景说明 情景设置,如图,当我们点击了购买,将会发生什么? 现有如下两张表 商品表 编号(id)名称(name)价格(price)库存(stock) 1F2战斗机100 ...

  3. OLAP、OLTP的介绍和比较 via csdn

    OLAP.OLTP的介绍和比较 数据处理大致可以分成两大类: OLTP(On-Line Transaction Processing)联机事务处理 也称为面向交易的处理系统,其基本特征是顾客的原始数据 ...

  4. hdu 3038 How Many Answers Are Wrong(种类并查集)2009 Multi-University Training Contest 13

    了解了种类并查集,同时还知道了一个小技巧,这道题就比较容易了. 其实这是我碰到的第一道种类并查集,实在不会,只好看着别人的代码写.最后半懂不懂的写完了.然后又和别人的代码进行比较,还是不懂,但还是交了 ...

  5. Canvas入门(1):绘制矩形、圆、直线、曲线等基本图形

    来源:http://www.ido321.com/968.html 一.Canvas的基础知识 Canvas是HTML 5中新增的元素,专门用于绘制图形.canvas元素就相当于一块“画布”,一块无色 ...

  6. Nonlinear Transform

    前文中,我们已经学习了linear classification,linear regression,logistic regression三种线性方法. 如何解决这种问题呢? 其实很好解决,只需要加 ...

  7. [Hive - LanguageManual] Create/Drop/Alter -View、 Index 、 Function

    Create/Drop/Alter View Create View Drop View Alter View Properties Alter View As Select Version info ...

  8. lipo命令

    工作中,xcode工程遇到一个bug file was built for archive which is not the architecture being linked armv7 找了一些资 ...

  9. Tomcat线程池,更符合大家想象的可扩展线程池

    因由 说起线程池,大家可能受连接池的印象影响,天然的认为,它应该是一开始有core条线程,忙不过来了就扩展到max条线程,闲的时候又回落到core条线程,如果还有更高的高峰,就放进一个缓冲队列里缓冲一 ...

  10. Linux服务器集群系统(一)(转)

    add by zhj:虽然是2002年的文章,但读来还是收益良多.在 章文嵩:谈LVS及阿里开源背后的精彩故事 中LVS发起人及主要贡献者谈了LVS的开发过程及阿里开源的一些故事 原文:http:// ...