通过递归的方式将字符串逆置打印

Posted SmartGame

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过递归的方式将字符串逆置打印相关的知识,希望对你有一定的参考价值。

  逆置打印字符串是有很多种方法的,个人感觉使用递归的方式很可以很容易的去理解栈的创建与析构,所以就稍微建立了模型;

  首先我们先看看理论:

  递归模型:
  1. 递归模型即是对自己本身的调用,一般用在函数或子函数函数的内部;
  2. 每调用一次函数,编译器就会分配另一个栈或堆空间;
  3. 当遇到终止条件时就开始析构函数(必须有终止条件,否则会无限分配空间内存,导致内存空间溢出,从而导致死机);

  有一个字符串"abcde",我们要将它逆置打印,也就是输出edcba,这里我们先用一个简单点的方法,通过数组的下标来打印,即将数据copy到一个数组中(数组足够大),直接将下标移到最后的位置,一个一个的往前打印;

  如下:

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <stdlib.h>
 5 
 6 
 7 void main()
 8 {
 9     //1.通过下标逆置
10     char *str = "abcde";    //一级指针指向字符串常量
11     char p[10] = {0};        //一维数组并初始化为空,防止出现乱码
12     int len = 0;            //计算数据长度
13     int i = 0;                //for循环打印数据
14     strcpy(p,str);            //将数据copy到数组中
15     len = strlen(str) - 1;        //算出字符串的长度因为,下标是从0开始,所以减一
16     
17     for(i = len ; i >= 0; i--)//直接通过下标逆置
18     {
19         printf("%c",p[i]);    //依序打印数据
20     }
21     system("pause");
22     return ;
23  
24 
25 }

 

  这个应该很容易看懂,所以我就不多做解释了,也可以通过指针来读取数据,在建立一个辅助指针变量,因为str指向字符串首地址,所以将新建的指针指向末地址,然后就和打印数组一样,一个一个的往后移,或者是直接逆置copy到一个数组中等等(切记,“abcde”是字符串常量,它拥有只读属性,也就是说不能修改它所在的内存空间只能读取数据);

  接下来就是我们要将的递归逆置打印,其实这个打印方法和数组打印很想,但是一个是正方向传递地址,一个是倒着传递地址:

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <stdlib.h>
 5 
 6 int inversion(char *p);//接受的是地址
 7 
 8 int main()
 9 {
10     char *str = "abcde";//将指针指向字符串常量
11 
12     inversion(str);//传递的是地址
13 
14     system("pause");
15     return 0;
16 }
17 
18 int inversion(char *p)
19 {
20     char *str;
21     if(*p == \'\\0\')//如果没有数据就返回
22     {
23         return 0;
24     }
25     str = p;//将p所指向的地址赋给str
26     inversion(p+1);//因为参数是指针所以将地址赋给它
27     printf("%c",*str);
28     return 0;
29 }

  这里一定要记住一点,调用函数时inversion时,调用它的栈是不会被析构掉的,而通过它则建立了一个新的栈空间,除非一整个函数体运行或者遇到终止命令,不然不会被析构掉,也就是说每建立一个新的栈区,从中分配str和p已经和上一个栈区的变量没有关系了。也就是说str每次指向的都是新传递过来的地址,图如下:

  

  因为建立了新的栈区所以每次用来接受地址的p已经和上一个栈中的p没有关系了,它已经指向了一个新的地址,当函数遇到终止命令或者运行完时就会被自动的析构掉;

  其实因为我们传递过去的是一个字符串常量,所以我们在写函数参数是可以这样写int inversion(const char *p);声明一下我这个是只读常量,或者说用const修饰告诉别人

不允许修改我这个指针所指向的空间数据;其实在C中const是有歧义的,这个在之前的C++中的const和C中的区别我稍微写过一点,因该是C++中对于const进行了功能加强。

以上是关于通过递归的方式将字符串逆置打印的主要内容,如果未能解决你的问题,请参考以下文章

单向链表反转,就地逆置与递归反转(无表头结点)

字符串逆置的两种递归写法

用递归进行链表逆置

单链表就地逆置的两种方法(递归与普通循环)

单链表的逆置使用递归算法出现-842150451这个值,请求高手予以解决。。

单链表的逆置使用递归算法出现-842150451这个值,请求高手予以解决。。