首页 > 代码库 > 字符串的逆序

字符串的逆序

普通排序:

直接分配一个同等大小的数组,反向copy即可.

char* Reverse(char* s){
    //将q指向字符串最后一个字符
    char* q = s ;
    while( *q++ ) ;
    q -= 2 ; 
    //分配空间,存储逆序后的字符串。
    char* p = newchar[sizeof(char) * (q - s + 2)] ; 
    char* r = p ;
    // 逆序存储
    while(q >= s)
        *p++ = *q-- ;
    *p = ‘\0‘ ;
    return r ;
}

原地排序:

  1. 1.     设置两个指针,分别指向字符串的头部和尾部,然后交换两个指针所指的字符,并向中间移动指针直到交叉。

char* Reverse(char* s){

    // p指向字符串头部

    char* p = s ;

    // q指向字符串尾部

    char* q = s ;

    while( *q )

        ++q ;

          q -- ;

    // 交换并移动指针,直到p和q交叉

    while(q > p) {

        char t = *p ;

        *p++ = *q ;

        *q-- = t ;

    }

    return s ;

}

  1. 2.     用递归的方式,需要给定逆序的区间,调用方法:Reverse(s, 0, strlen(s)) ;

// 对字符串s在区间left和right之间进行逆序,递归法

void Reverse( char* s, int left, int right ){

    if(left >= right)

        return s ;

    char t = s[left] ;

    s[left] = s[right] ;

    s[right] = t ;

    Reverse(s, left + 1, right - 1) ;

}

  1. 3.     非递归法,同样指定逆序区间,和方法一没有本质区别,一个使用指针,一个使用下标。

// 对字符串str在区间left和right之间进行逆序

char* Reverse( char* s, int left, int right ){

    while( left < right )    {

        char t = s[left] ;

        s[left++] = s[right] ;

        s[right--] = t ;

    }

    return s ;

}

  1. 4.      

char a = ‘a‘, b = ‘b‘;
a = a + b;
b = a - b;
a = a - b;

逆序打印:

  先求出字符串长度,然后反向遍历即可。

void ReversePrint(const char* s)
{
    int len = strlen(s) ;
    for (int i = len - 1; i >= 0; --i)
        cout << s[i];
}

  如果不想求字符串的长度,可以先遍历到末尾,然后在遍历回来,这要借助字符串的结束符‘\0

void ReversePrint(const char* s){

    const char* p = s ;

    while (*p)

        *p++ ;

   --p ; //while结束时,p指向‘\0‘,这里让p指向最后一个字符

   while (p >= s)    {

        cout <<*p ;

        --p ;

    }

}

   对于上面第二种方法,也可以使用递归的方式完成。

void ReversePrint(const char* s){

    if(*(s +1) != ‘\0‘)
        ReversePrint(s + 1) ;
    cout << *s ;
}