仔细注意指针是怎么移动的
01.申请内存进行swap;
注意参数使用的是const,以及函数体内p、q指针的移动速度,为什么用q -= 2;为什么sizeof(char) * (q - s + 2);
char* Reverse1(const char* s)
{
//将q指向字符串最后一个字符
char* q = (char*)s ;
while( *q++ ) ;
q -= 2 ;
//分配空间,存储逆序后的字符串。
char* p = new char[sizeof(char) * (q - s + 2)] ;
char* r = p ;
// 逆序存储
while(q >= s)
*p++ = *q-- ;
*p = '\0' ;
return r ;
}
02.使用指针进行swap
char* Reverse2(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 ;
}//swap
return s ;
}
03.对字符串s在区间left和right之间进行逆序,递归法、下标法
void Reverse3( char* s, int left, int right )
{
if(left >= right)
return;
char t = s[left] ;
s[left] = s[right] ;
s[right] = t ;
Reverse3(s, left + 1, right - 1) ;
}
04.对字符串s在区间left和right之间进行逆序,下标法
char* Reverse4( char* s, int left, int right )
{
while( left < right )
{
char t = s[left] ;
s[left++] = s[right] ;
s[right--] = t ;
}//swap
return s ;
}
05.使用异或操作对字符串s进行逆序
char* Reverse5(char* s)
{
char* r = s ;
//令p指向字符串最后一个字符
char* p = s;
while (*(p + 1) != '\0')
++p ;
// 使用异或操作进行交换
while (p > s)
{
*p = *p ^ *s ;
*s = *p ^ *s ;
*p = *p-- ^ *s++ ;
}//swap
return r ;
}
测试程序如下
int main()
{
char arr1[]="abcdefg";
char arr2[]="abcdefg";
char arr3[]="abcdefg";
char arr4[]="abcdefg";
char arr5[]="abcdefg";
char arr6[]="abcdefg";
cout<<"arr1Reversed : "<<Reverse1(arr1)<<endl;
cout<<"arr2Reversed : "<<Reverse2(arr2)<<endl;
Reverse3(arr3,0,6);
cout<<"arr3Reversed : "<<arr3<<endl;
cout<<"arr4Reversed : "<<Reverse4(arr4,0,6)<<endl;
cout<<"arr5Reversed : "<<Reverse5(arr5)<<endl;
return 0;
}
呵呵 先到这里吧