zoukankan      html  css  js  c++  java
  • 【0006】数据的压缩、解压缩——时间优先、空间优先

    时间优先的方式实现数据的压缩、解压缩

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    // "aaaaabbbhaihualovefangfangooooooooo";    --> 5a3bhaihualovefangfang9o
    char * timefastzip(char *str)
    {
        int length = strlen(str);                                // 获取待压缩字符串的长度
        char *newstr = (char *)calloc(length, sizeof(char));    // 给压缩的字符串开辟内存
    
        char *pstr = str;
        char *pnewstr = newstr;            // 保存分配内存的首地址
    
        while (*pstr != '')
        {
            int charlength = 0;
            char * p = pstr;
            while (*p == *(p + 1))
            {
                charlength++;                        // 统计重复字母次数
                p++;
            }
    
            if (charlength == 0)
                *pnewstr++ = *pstr++;
            else
            {
                *pnewstr = charlength + 1 + '0';    // 重复字母个数转化为数值型字符
                *(pnewstr + 1) = *pstr;
                pnewstr += 2;
                pstr += charlength + 1;
            }
        }
    
        _recalloc(newstr, strlen(newstr), sizeof(char));        // 释放压缩的空间
    
        return newstr;
    }
    
    char * timefastunzip(char *str)
    {
        char *newstr = (char *)calloc(10000, sizeof(char));
    
        char *pstr = str;
        char *pnewstr = newstr;
    
        while (*pstr != '')
        {
            char *p = pstr;
            if (*p >= '0'&&*p <= '9')
            {
                int length = *p - '0';
                for (int i = 0; i < length; i++)
                {
                    *pnewstr++ = *(p + 1);
                }
                pstr += 2;
            }
            else
            {
                *pnewstr++ = *pstr++;
            }
        }
    
        _recalloc(newstr, strlen(newstr), sizeof(char));
    
        return newstr;
    }
    
    void main006()    
    {
        char str[1024] = "aaaaabbbhaihualovefangfangooooooooo";    // 5a3bhaihualovefangfang9o
    
        printf("%s 
    ", str);
        printf("%s 
    ", timefastzip(str));
        printf("%s 
    ", timefastunzip(str));
    
        system("pause");
    }
    时间优先

    空间优先的方式实现数据的压缩、解压缩

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    // 双指针法操作字符串
    // "aaaaabbbhaihualovefangfangooooooooo";    --> 5a3bhaihualovefangfang9o
    char * spacezipa(char *str)        // 压缩字符串中的a
    {
        char *p1 = str;
        char *p2 = str;
    
        while (*p1 = *p2)
        {
            if (*p1 != 'a')
            {
                p1++;
                p2++;
            }
            else
            {
                p2++;
            }
        }
    
        return str;
    }
    char * spacezipX(char *str)        // abhaihualovefangfango
    {
        char *p1 = str;
        char *p2 = str;
    
        while (*p1 = *p2)
        {
            int length = 1;
            while (*p1 == *p2)
            {
                p2++;
            }
            p1++;
        }
    
        return str;
    }
    char * spacezip(char *str)        // 5a3bhaihualovefangfang9o
    {
        char *p1 = str;
        char *p2 = str;
    
        while (*p1 = *p2)
        {
            int length = 1;
            char *p3 = p2 + 1;
            while (*p1 == *p3)
            {
                p3++;
                length++;
            }
    
            if (length > 1)
            {
                *p1 = length + '0';
                *(p1 + 1) = *(p3 - 1);
                p1 += 2;
                p2 += length;
            }
            else
            {
                p1++;
                p2++;
            }
        }
    
        return str;
    }
    
    char * spaceunzip(char *str)
    {
        char *p1 = str;
        char *p2 = str;
    
        while (*p1 = *p2)
        {
            int length = 0;
            if (*p1 >= '0'&&*p1 <= '9')
            {
                length = *p1 - '0';
            }
    
            if (length == 0)
            {
                p1++;
                p2++;
            }
            else
            {
                char ch = *(p1 + 1);
                for (char *p = p1 + strlen(p1); p > p1 + 1; p--)        // 5a  扣除两个字符
                {
                    *(p + length - 2) = *p;
                }
                
                for (int i = 0; i < length; i++)
                {
                    *(p1 + i) = ch;
                }
    
                p1 += length;
                p2 = p1;
            }
        }
    
        return str;
    }
    
    void main007()    
    {
        char str[1024] = "aaaaabbbhaihualovefangfangooooooooo";    // 5a3bhaihualovefangfang9o
    
        printf("%s 
    ", str);
        printf("%s 
    ", spacezip(str));
        printf("%s 
    ", spaceunzip(str));
    
        system("pause");
    }
    空间优先
  • 相关阅读:
    GhostBSD 3.0RC3,基于GNOME的FreeBSD
    Nagios 3.4.3 发布,企业级监控系统
    Jolokia 1.0.6 发布, JMX远程访问方法
    微软希望开发人员不要使 WebKit 成为新版 IE6
    Kwort Linux 3.5 正式版发布
    EJDB 1.0.24 发布,嵌入式 JSON 数据库引擎
    Pale Moon 15.3 Firefox“苍月”优化版发布
    Galera Load Balancer 0.8.1 发布
    SmartSVN V7.5 正式发布
    PostgresQL建立索引如何避免写数据锁定
  • 原文地址:https://www.cnblogs.com/ant-colonies/p/13434023.html
Copyright © 2011-2022 走看看