首页 > 代码库 > 字符串的逆序
字符串的逆序
普通排序:
直接分配一个同等大小的数组,反向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. 设置两个指针,分别指向字符串的头部和尾部,然后交换两个指针所指的字符,并向中间移动指针直到交叉。
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 ;
}
- 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) ;
}
- 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 ;
}
- 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 ;
}