输入一个字符串,将其逆转并输出。eg:s=“abcd”,逆序后变成s=“dcba”。

1.原地逆序

  原地逆序不允许额外分配空间,就是将字符串两边的字符逐个交换。

(1)设置两个指针,分别指向字符串的头部和尾部,然后交换两个指针所指的字符,并向中间移动,直到交叉。(这个方法最普遍)  

 1 #include <stdio.h>
 2 
 3 char * reverse_str(char *str)
 4 {
 5     char *p,*q;
 6     p=str;
 7     q=str;
 8     while(*q)
 9         q++;
10     q--;
11     while(p<=q)
12     {
13         char a=*p;
14         *p++=*q;
15         *q--=a;
16     
17     }
18     return str;
19 }
20 
21 int main()
22 {
23 //  char string[]="abcdefg";
24     char string[128]; 
25     scanf("%s",string);
26     printf("now: %s\n",reverse_str(string));
27     return 0;
28 }

(2)递归,调用方法 reverse_str(str,0,strlen(str)-1),对字符串 str 在区间 left 和 right 之间进行逆序。

 1 char *reverse_str(char *str,int left,int right)
 2 {
 3 
 4     if(left>=right)
 5         return str;
 6 
 7     char t=str[left];
 8     str[left]=str[right];
 9     str[right]=t;
10     return reverse_str(str,left+1,right-1);
11     
12 }
View Code

2.普通逆序

  直接分配一个与原字符串等长的字符数组,然后反向拷贝。

3.按单词逆序

  给定一个字符串,按单词将其逆序。eg:“This is a student”,输出是 “student a is This”。分两步,第一步,先按单词逆序,得到“sihT si a tneduts”,第二步将整个句子逆序,“student a is This”。

  对于第一步,关键是如何确定单词,这里以空格为分界。

 1 void reverse_str(char *p,char *q)
 2 {
 3     while(p<q)
 4     {
 5         char t=*p;
 6         *p++=*q;
 7         *q--=t;
 8     }
 9     
10 }
11 char *reverse_sen(char *sen)
12 {
13     char *p=sen;
14     char *q=sen;
15     while(*p!='\0')
16     {
17         if(*p==' ')
18         {
19             reverse_str(q,p-1);
20             p++;
21             q=p;
22         }
23         else
24             p++;
25     }
26     reverse_str(q,p-1);
27     reverse_str(sen,p-1);
28     return sen;
29 }
30 int main()
31 {
32     char str[]="This is a student";    
33 //    char string[128];
34 //    scanf("%s",string);
35     printf("now: %s\n",reverse_sen(str));
36     return 0;
37 }

4.逆序打印

  用递归的方式完成递归打印

1 void reverse_print(char *str)
2 {
3     if(*(str+1)!='\0')
4         reverse_print(str+1);
5     printf("%c",*str);
6 }

 

  

 

posted on 2016-12-08 10:36  绽放的四叶草  阅读(400)  评论(0编辑  收藏  举报