C字符串壓縮算法

jopen 12年前發布 | 36K 次閱讀 算法

#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 );

&nbsp;   free( pUnzipStr ); pUnzipStr = NULL;

return 0;

}</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!