zoukankan      html  css  js  c++  java
  • 59. 分别用迭代与递归来实现逆置字符串。同时练习递归逆序时保存数据。

    //用迭代实现

     1 //实现字符串逆置
     2 #include <stdio.h>
     3 #include <string.h>
     4 
     5 void reverseStr(char * str)
     6 {
     7     char* right = str + strlen(str) - 1;
     8     char* left = str;
     9     while(left<right)
    10     {
    11         *left ^= *right;
    12         *right ^= *left;
    13         *left ^= *right;
    14         left++;
    15         right--;
    16     }
    17 }
    18 
    19 
    20 
    21 
    22 
    23 int main(void)
    24 {
    25     char str[] = "123";
    26 
    27     reverseStr(str);
    28 
    29     char* p = str;
    30     while(*p)
    31     {
    32         printf("%c",*p);
    33         p++;
    34     }
    35 
    36 
    37     return 0;
    38 }

    //用递归实现,学会实现递归逆序时保存数据。

    使用全局buffer版

     1 //使用全局buffer版
     2 #include <stdio.h>
     3 #include <string.h>
     4 
     5 char buffer[1024];
     6 char* buf = buffer;
     7 void reverseStr(char * str)
     8 {
     9     if(*str)
    10     {
    11          reverseStr(str+1);
    12          *buf++ = *str;
    13     }
    14 }
    15 
    16 int main()
    17 {
    18     char str[] = "123";
    19     reverseStr(str);
    20 
    21     char* p = buffer;
    22     while(*p)
    23     {
    24         printf("%c",*p);
    25         p++;
    26     }
    27     return 0;
    28 }

    使用局部buffer版。

      1 //使用局部buffer版
      2 #include <stdio.h>
      3 #include <string.h>
      4 
      5 //错误   每次调用均是给buf第一个元素赋值
      6 void reverseStr1(char * str,char* buf)
      7 {
      8     if(*str)
      9     {
     10         reverseStr1(str+1,buf);
     11         *buf++ = *str;
     12     }
     13 }
     14 
     15 
     16 
     17 //错误   拿最后一个填最后一个,最后存完仍是正序
     18 void reverseStr2(char * str,char* buf)
     19 {
     20     if(*str)
     21     {
     22         reverseStr2(str+1,buf+1);
     23         *buf = *str;
     24     }
     25 }
     26 
     27 
     28 
     29 //正确,拿str最后一个填给buff第一个上,最后存完是逆序。但是不推荐这样用,调用传递参数时太麻烦。
     30 void reverseStr3(char * str,char* buf)
     31 {
     32     if(*str)
     33     {
     34         reverseStr3(str+1,buf-1);
     35 
     36         *buf = *str;
     37     }
     38 }
     39 
     40 //正确  ,推荐,使用strncat,去除了移动buf的麻烦,最好的实现
     41 void reverseStr4(char * str,char* buf)
     42 {
     43     if(*str)
     44     {
     45         reverseStr4(str+1,buf);
     46 
     47         strncat(buf,str,1);
     48     }
     49 }
     50 
     51 //正确 ,喜欢这个思路,在递归函数中用下静态变量,对递归的同时同步保存数据好用。
     52 void reverseStr5_1(char * str,char* buf)//思路对,用法错
     53 {
     54     static char* sbuf = buf;//定义静态变量必须使用常量初始化,这里报错
     55     if(*str)
     56     {
     57         reverseStr5_1(str+1,buf);
     58          *sbuf++ = *str;
     59     }
     60 
     61 }
     62 //正确
     63 void reverseStr5_2(char * str,char* buf)//思路对,用法对
     64 {
     65     static int i = 0;//定义静态变量必须使用常量初始化
     66     if(*str)
     67     {
     68         reverseStr5_2(str+1,buf);
     69         *(buf + (i++)) = *str;
     70     }
     71 }
     72 
     73 int main()
     74 {
     75 #if 0  //1错误,要明白为何错误,体会过程
     76     char str[] = "123456789";
     77     char buffer[1024] = {0};
     78     reverseStr1(str,buffer);
     79     //...
     80 #endif
     81 
     82 
     83 
     84 #if 0   //2错误,要明白为何错误,体会过程
     85     char str[] = "123456789";
     86     char buffer[1024] = {0};
     87     reverseStr2(str,buffer);
     88     //...
     89 #endif
     90 
     91 
     92 #if 0   //3正确
     93     char str[] = "123456789";
     94     int bufLen = strlen(str)+1;
     95     char buffer[bufLen];//变长数组定义时不能初始化,也可以考虑用堆空间
     96     reverseStr3(str,buffer+bufLen-2);//传入buffer从倒数第二个位置,最后一个位置用来存
     97     buffer[bufLen-1] = '';
     98 #endif
     99 
    100 #if 0 //4正确
    101     char str[] = "123456789";
    102     char buffer[1024] = {0};
    103     reverseStr4(str,buffer);
    104     buffer[strlen(str)] = '';
    105 #endif
    106 
    107 
    108 #if 1//5_2正确
    109     char str[] = "123456789";
    110     char buffer[1024] = {0};
    111     reverseStr5_2(str,buffer);
    112     buffer[strlen(str)] = '';
    113 #endif
    114 
    115 
    116 
    117     char* p = buffer;
    118     while(*p)
    119     {
    120         printf("%c",*p);
    121         p++;
    122     }
    123     return 0;
    124 }
     
    
    
  • 相关阅读:
    根据数据库表字段动态生成选择画面
    ABAP中字符串处理方法小结(二)
    如何获取汉字字符串长度
    如何强制分页-[NEW-PAGE]
    如何设置输出颜色-[FORMAT..COLOR..]
    ◆◆0如何取得字符串最后一位
    VALSE2019
    pycharm使用总结
    生活经验
    爱情存在吗-3
  • 原文地址:https://www.cnblogs.com/ZhuLuoJiGongYuan/p/9555937.html
Copyright © 2011-2022 走看看