句内单词反转
2016-07-26 00:00
232 查看
要求:将一个字符串在句内按单词反转,如将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; }程序运行结果如下:
相关文章推荐
- 【安卓网络请求开源框架Volley源码解析系列】初识Volley及其基本用法
- 【安卓网络请求开源框架Volley源码解析系列】初识Volley及其基本用法
- 安卓中的事件分发机制源码解析
- 求某一字符串的最长重复子串
- 安卓中的事件分发机制源码解析
- 安卓java.lang.IllegalArgumentException: The observer is null.解决方案
- 求某一字符串的最长重复子串
- Fragment生命周期详解
- 安卓java.lang.IllegalArgumentException: The observer is null.解决方案
- 【安卓中的缓存策略系列】安卓缓存之内存缓存LruCache
- Fragment生命周期详解
- 【java集合框架源码剖析系列】java源码剖析之TreeMap
- 【安卓中的缓存策略系列】安卓缓存之内存缓存LruCache
- JavaI/O体系详解
- 【java集合框架源码剖析系列】java源码剖析之TreeMap
- 【腾讯校招在线考试附加题】将一个10进制数转换为四位定长的36进制数
- JavaI/O体系详解
- 数据库三种范式详解
- 【腾讯校招在线考试附加题】将一个10进制数转换为四位定长的36进制数
- 【数据结构栈应用系列】括号匹配