翻转句子中单词的顺序

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。

例如输入“I am a student.”,则输出“student a am I”。

由于本题需要翻转句子,我们先颠倒句子中的所有字符。这时,不但翻转了句子中单词的顺序,而且单词内字符也被翻转了。我们再颠倒每个单词内的字符。由于单词内的字符被翻转两次,因此顺序仍然和输入时的顺序保持一致。

#include <iostream>
using namespace std;

void Reverse(char *start,char *end) //翻转字符串
{
     if(start==NULL||end==NULL)
        return;
    
     char temp;
     while(start<end)
     {
            temp=*start;
            *start=*end;
            *end=temp;
            start++;
            end--;        
     }
}

char *ReverceSentence(char *pstr)
{
    if(pstr==NULL)
       return NULL;
    
     //先将整个句子翻转
     char *start=pstr;
     char *end=pstr+strlen(pstr)-1;
     Reverse(start,end);
    
     start=pstr;
     end=pstr;
    
     //取出一个个单词,翻转之
     while(*start!='\0')
     {
       if(*start==' ')   //单词起始至非空格字符
          {
            start++;
            end++;
            continue;       
          }
       else if(*end==' '||*end=='\0')    //结束至空格或结束符前一个字符
       {
            Reverse(start,--end);
            start=++end;
       } 
       else
         end++; 
     }
     return pstr;
}
int main()
{
      char sentence[]="I am a student!";
      char *reverced=ReverceSentence(sentence);
      cout<<reverced<<endl;
      system("pause");
      return 0;
}

posted @ 2012-08-26 21:35  CobbLiu  阅读(425)  评论(0)    收藏  举报