zoukankan      html  css  js  c++  java
  • 结构笔记—串的基本操作及串的模式匹配算法

    下面实现几种串的基本操作,这些操作是构成串其他复杂操作的基石。因为相对简单,功能和分析的说明均在代码实现中。

    /*动态分配存储结构*/
    typedef struct
    {
        char *ch;
        int length;
    }Str;
    
    /*赋值操作*/
    int strAssign(Str &str, char *ch)
    {
        if(str.ch)
            free(str.ch);  //释放原串空间
    
        int len = 0;
        char *c = ch;
        while(*c)  //求ch串长度
        {
            len++;
            c++;
        }
    
        if(len == 0)  //如果ch为空串,则直接返回空串
        {
            str.ch = NULL;
            str.length = 0;
            return 1;
        }
    
        str.ch = (char*)malloc(sizeof(char) * (len+1));  //取len + 1是为了多分配一个空间存放“”字符
        if(str.ch == NULL)  //申请空间失败
            return 0;
        c = ch;
        for(int i = 0; i <= len; i++)   //注意:循环条件"<="是为了将ch最后的''复制到新串中作为结束标志
            str.ch[i] = *(c++);
        str.length = len;
        return 1;
    }
    
    
    /*求串长度*/
    int StrLength(Str str)
    {
        return str.length;
    }
    
    /*串比较操作
    *串的比较操作是串排序的核心操作
    */
    int strCompare(Str s1, Str s2)
    {
        for(int i = 0; i < s1.length && i < s2.length; i++)
        {
            if(s1.ch[i] != s2.ch[i])
                return s1.ch[i] - s2.ch[i];
        }
        return s1.length - s2.length;
    }
    
    /*串连接操作
    *将两个串首位连接,合成一个字符串的操作称为串连接操作
    */
    int concat(Str &str, Str s1, Str s2)
    {
        if(str.ch)
            free(str.ch);
        
        str.ch = (char*)malloc(sizeof(char) * (s1.length + s2.length +1));
        if(str.ch == NULL)
            return 0;
        int i = 0;
        while(i < s1.length)
            str.ch[i] = s1.ch[i++];
        int j = 0;
        while(j <= s2.length)
            str.ch[i+j] = s2.ch[j++];
        str.length = s1.length + s2.length;
        return 1;
    }
    
    /*求子串操作
    *求从给定串中某一位置开始到某一位置结束的操作称为求子串操作(规定开始位置总是在结束位置前边)
    *以下代码实现求串中从pos位置开始,长度为len的子串,子串由subStr返回给用户
    *函数返回:成功1,失败0
    */
    int subStr(Str &subStr, Str str, int pos, int len)
    {
        if(pos < 0 || len < 0||  pos + len > str.length)
            return 0;
        if(subStr.ch)
            free(subStr.ch);
    
        if(len == 0)
        {
            subStr.ch = NULL;
            subStr.length = 0;
            return 1;
        }
    
        subStr.ch = (char*)malloc(sizeof(char) * (len+1));
        if(subStr.ch == NULL)
            return 0;
        int i = 0, j = pos;
        while(j < pos + len)
            subStr.ch[i++] = str.ch[j++];
        subStr.ch[i] = '';
        subStr.length = len;
        return 1;
    }
    
    /*串清空操作*/
    int clearStr(Str &str)
    {
        if(str.ch)
        {
            free(str.ch);
            str.ch = NULL;
        }
        str.length = 0;
        return 1;
    }

    串的匹配模式算法

  • 相关阅读:
    git命令
    svg学习系列02-简单的svg图形和线条
    svg学习系列01-svg简介
    jQuery分页插件
    svg简介
    css3选择器
    sublime使用
    HTML5新特性
    html新的语义化标签和表单控件
    DOM详解
  • 原文地址:https://www.cnblogs.com/evenleee/p/8545149.html
Copyright © 2011-2022 走看看