方式一:将字符串反向输出来,不改变内存(递归实现)
void reverse_string(char *str)
{
/*遇到'\0'什么也不做,函数结束*/
if(*str == '\0')
;
else
{
/*输出下一个*/
reverse_string(str + 1);
cout<<*str;
}
}
方式二
:
改变内存(
交换法
)
/*非递归实现:操作内存*/
char *reverse_string1(char *str)
{
char *left = str; //存放字符数组的最左边
char *right = str; //存放字符数组的最右边
while(*right != '\0')
{
right++;
}
/*while循环之后,right指向'\0',right--之后,指向最后一个非'\0'字符*/
right--;
/*左右对称的两个元素交换*/
char temp;
while(left < right)
{
temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
return str;
}
方式三:
改变内存(
递归实现
)
/*递归实现:操作内存*/
/*递归每调用一次:要反转的字符串头和尾各减少一个*/
char *reverse_string2(char *str)
{
int lenth = strlen(str);
/*空字符串lenth=0或者lenth=1只有一个有效字符的字符串无需反转*/
if(lenth <= 1)
{
return NULL;
}
char temp;
/*当字符串至少存在两个非'\0'字符时才用的到反转*/
if(lenth > 1)
{
temp = str[0];
str[0] = str[lenth-1];
/*最后一个字符在下次递归时不再处理*/
str[lenth - 1] = '\0';
/*递归每调用一次,要反转的字符串头和
尾各减少一个*/
reverse_string2(str + 1);
str[lenth-1] = temp;//(利用站先入后出的特性)
}
return str;
}
测试:
#include<stdio.h>
#include<iostream>
using namespace std;
/*递归实现:操作内存*/
/*递归每调用一次:要反转的字符串头和尾各减少一个*/
char *reverse_string2(char *str)
{
int lenth = strlen(str);
/*空字符串lenth=0或者lenth=1只有一个有效字符的字符串无需反转*/
if(lenth <= 1)
{
return NULL;
}
char temp;
/*当字符串至少存在两个非'\0'字符时才用的到反转*/
if(lenth > 1)
{
temp = str[0];
str[0] = str[lenth-1];
/*最后一个字符在下次递归时不再处理*/
str[lenth - 1] = '\0';
/*递归每调用一次,要反转的字符串头和
尾各减少一个*/
reverse_string2(str + 1);
str[lenth-1] = temp;//(利用站先入后出的特性)
}
return str;
}
/*非递归实现:操作内存*/
char *reverse_string1(char *str)
{
char *left = str; //存放字符数组的最左边
char *right = str; //存放字符数组的最右边
while(*right != '\0')
{
right++;
}
/*while循环之后,right指向'\0',right--之后,指向最后一个非'\0'字符*/
right--;
/*左右对称的两个元素交换*/
char temp;
while(left < right)
{
temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
return str;
}
void reverse_string(char *str)
{
/*遇到'\0'什么也不做,函数结束*/
if(*str == '\0')
;
else
{
/*输出下一个*/
reverse_string(str + 1);
cout<<*str;
}
}
int main()
{
char str1[] = "ABCDEFGH";
char str2[] = "ABCDEFGH";
char str3[] = "ABCDEFGH";
cout<<reverse_string1(str1)<<endl;
cout<<reverse_string2(str2)<<endl;
reverse_string(str3);
cout<<endl;
return 0;
}