句内单词反转
2016-03-10 11:37
337 查看
要求:将一个字符串在句内按单词反转,如将I am a student.反转后输出student. a am I
思路一:很容易观察到输出后的结果是在原字符串基础上按单词逆序输出,因此很容易想到用栈来实现,因为栈是用来先进后出的一种数据结构,因此我们可以将每个单词入栈,然后出栈即为结果。
思路二:可以考虑用反转函数来实现,即先将整个句子反转,然后再将每个单词反转。如:将原字符串反转后为:.tneduts a ma I,然后再将每个单词反转结果为:student. a am I即为所求结果。反转函数的实现很简单,关键是对句内单词的反转,即怎样才符合是一个单词。如果用pIndex字符指针指向当前处理字符,则当*pIndex!=' '&&*(pIndex+1)==' '时即满足当前子串为一个单词。具体可以参看我的博文统计字符串单词个数。基于此思路的代码如下:
#include<iostream> using namespace std; void reserve(char *pstr,int start,int end) { while(pstr[start]!='\0'&&start<end) { swap(pstr[start],pstr[end]); start++; end--; } } void reserve(char *start,char *end) { while(start<end) { swap(*start,*end); start++; end--; } }//当考虑到要用指针来操作字符串的时候,反转函数最好写这一个,因为前面一个 //参数中要涉及到int型形参,这样不利于指针操作,或者说指针的灵活性不能体现 //出来。 void wordReserve(char *pStr) { char *pStart=pStr; while(*pStr!='\0') { pStr++; } char *pEnd=pStr-1;//此处必须减1,因为while循环终止的条件是*pstr='\0' reserve(pStart,pEnd);//反转整个句子 char *pIndex=pStart; char *start,*end,*temp; while(*pIndex) { if(*pIndex==' ') { pIndex++; } else { start=pIndex; while(*pIndex&&(*pIndex)!=' ')//用来判断是否为一个单词 { pIndex++; } end=pIndex-1;//此处必须减1,因为while循环终止的条件是*pIndex=‘ ’ reserve(start,end);//反转每个单词 } } } void main() { char str[]="I am a student."; wordReserve(str); cout<<str<<endl; }程序运行结果如下:
相关文章推荐
- CGAffineTransform 放射变换解析 即矩阵变换
- Oracle SQL性能优化
- DP-BZOJ-1600- [Usaco2008 Oct]建造栅栏
- 2879: [Noi2012]美食节 动态加边 费用流
- wm_copydata 进城通信
- 句内单词反转
- C++第一次实验-2-3 2016.3.10
- c++第1次上机实验-3
- win7(32/64)+apache2.4+php5.5+mysql5.6 环境搭建配置
- 链表
- 关二爷@程序猿,这样拿百万年薪,妥妥的
- 对取出的数据排序
- layoutsubview 的使用
- location.hash详解
- 解读ASP.NET 5 & MVC6系列(8):Session与Caching
- 升级到ie11后,打开F12微空白页面的解决方法
- 欢迎使用CSDN-markdown编辑器
- Memcached常用参数
- RunTime 入门
- [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;