C语言---递归反向输出任意长度的字符串
2016-04-22 19:02
477 查看
(该字符串可以包含空格和回车!)
【题目要求】
编写一个递归函数,实现将输入的任意长度的字符串反向输出的功能。
例如输入字符串:ABCD,输出字符串:DCBA。
【题目分析】
应用递归的思想有时可以很轻松地解决一些看似不太容易实现的功能。
本题就是利用递归方法解决这类问题的一个代表。要将一个字符串反向地输出,一般采用的方法是将该字符串存放到一个数组中,然后将数组元素反向地输出即可。
这样需要一个存储空间,而且字符串的长度无法自由掌握,因为数组是一种静态数据结构。如果选用动态生成的顺序表或者链表来存放字符串,那么实现起来会比较麻烦,特别是如果把字符串存放到单向链表中,反向输出是非常困难的。
如何才能输入任意长度的字符串,然后将其反向输出呢?
可以通过一个递归的方法巧妙地实现这个功能。
算法描述如下:
在该算法中,字符串的结束标志为#,并且#不作为字符串中的内容输出。首先输入字符串的一个字符,存放到变量a中:然后递归地调用函数print(),重复上述操作,知道输入字符串结束标志#为止;然后输出字符串中的字符。
如上图所示,从屏幕上输入字符串ABC,并以#作为结束标志,然后反向输出该字符串,整个流程沿着图中箭头方向执行。因此输出的字符串与输入的字符串方向相反。
整个实现的C源代码:
输出结果:
下面的是没实现递归的Java实现这个功能的完整代码:
而且貌似java也不能从控制端读入单个字符。。。。
所以并不能实现这个c能实现的递归功能。
【题目要求】
编写一个递归函数,实现将输入的任意长度的字符串反向输出的功能。
例如输入字符串:ABCD,输出字符串:DCBA。
【题目分析】
应用递归的思想有时可以很轻松地解决一些看似不太容易实现的功能。
本题就是利用递归方法解决这类问题的一个代表。要将一个字符串反向地输出,一般采用的方法是将该字符串存放到一个数组中,然后将数组元素反向地输出即可。
这样需要一个存储空间,而且字符串的长度无法自由掌握,因为数组是一种静态数据结构。如果选用动态生成的顺序表或者链表来存放字符串,那么实现起来会比较麻烦,特别是如果把字符串存放到单向链表中,反向输出是非常困难的。
如何才能输入任意长度的字符串,然后将其反向输出呢?
可以通过一个递归的方法巧妙地实现这个功能。
算法描述如下:
print(){ 输入字符串的一个字符a: if(a!='#') print(); if(a!='#') then 输出该字符a; }
在该算法中,字符串的结束标志为#,并且#不作为字符串中的内容输出。首先输入字符串的一个字符,存放到变量a中:然后递归地调用函数print(),重复上述操作,知道输入字符串结束标志#为止;然后输出字符串中的字符。
假设从屏幕上输入字符串ABC,并且以#作为结束标志,函数print()的递归过程如下图所示:
如上图所示,从屏幕上输入字符串ABC,并以#作为结束标志,然后反向输出该字符串,整个流程沿着图中箭头方向执行。因此输出的字符串与输入的字符串方向相反。
整个实现的C源代码:
#include <stdio.h> #include <stdlib.h> print(){ char a ; scanf("%c",&a); if(a!='#'){ print(); } if(a!='#'){ printf("%c",a); } } int main() { printf("Please input a string ending for '#' :\n"); print(); return 0; }
输出结果:
下面的是没实现递归的Java实现这个功能的完整代码:
而且貌似java也不能从控制端读入单个字符。。。。
所以并不能实现这个c能实现的递归功能。
package cn.hncu; import java.util.Scanner; public class String1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String strs = ""; while(true){ int k=-1; String str = sc.nextLine(); for(int i=0;i<str.length();i++){ if(str.charAt(i)=='#'){ k=i; } } if(k==-1){ strs = strs+str+"\r\n"; }else{ for(int i=0;i<k;i++){ strs = strs+str.charAt(i); } } if(k!=-1){ break; } } for(int i=strs.length()-1;i>=0;i--){ if(strs.charAt(i)=='\n'){ System.out.println(); i--; continue; } System.out.print(strs.charAt(i)); } } }
相关文章推荐
- c/c++ 数字转成字符串, 字符串转成数字
- C++读取mysql中utf8mb4编码表数据乱码问题及UTF8转GBK编码
- C++作业4
- C++开源日志库Glog的使用(VS2010)
- VS2008非托管C++调用wcf(WebService)服务
- c++学习_拷贝构造函数应用的三种情况
- 关于C语言输出格式符中的传值问题
- 我的C++第四次作业
- 可变参数的宏定义
- c++ 构造函数、拷贝构造函数——c++复习(二)
- C/C++复习:计算该日是该年的第几天(结构体)
- C++中接口与实现的分离技术
- C语言中+的优先级大于>>
- C/C++复习:不等长字符串的排序(1)
- C++作业4
- C/C++复习:字符串的比较
- 根据基准时间的毫秒数获取现在的时间
- C++的精髓——虚函数
- OC最实用的runtime总结
- C++虚表