反转单词顺序可以用栈来顺序存储单词,或用istringstream 字符串流来做或用最原始的反转来做
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
using namespace std;
// 翻转单词
//反转字符串
void Reverse(char *pBegin,char *pEnd)
{
if(pBegin==NULL||pEnd==NULL)
{
return ;
}
while(pBegin<pEnd)
{
char temp=*pBegin;
*pBegin=*pEnd;
*pEnd=temp;
pBegin++;pEnd--;
}
}
char* ReverseSentence(char *str)
{
if(str==NULL)
{
return NULL ;
}
int length=strlen(str);
char *pBegin=str;
char *pEnd=str+length-1;
Reverse(pBegin,pEnd);
pBegin=pEnd=str;
while(*pBegin!='\0')//pBegin遍历完字符串
{
if(*pBegin==' ')
{
pBegin++;
pEnd++;
}
else if(*pEnd==' '||*pEnd=='\0')
{
Reverse(pBegin,--pEnd);//此处pEnd=' ' 要往前移动一个
pBegin=++pEnd;//pBegin pEnd 要再次移到空格
}
else
{
pEnd++;
}
}
return str;
}
///左旋字符串等价于循环左移字符串 对于abcdefg 左旋2位或叫循环左移两位 结果为 cdefgab
//三次反转即可得到左旋字符串
char* LeftRotateString(char *str,int n)//左旋n位
{
if(str==NULL||n<0)
{
return NULL;
}
int length=strlen(str);
char *pFirstBegin=str;
char *pFirstEnd=str+n-1;
char *pSecondBegin=str+n;
char *pSecondEnd=str+length-1;
Reverse(pFirstBegin,pFirstEnd);//翻转字符串前n个字符
Reverse(pSecondBegin,pSecondEnd);//翻转字符串后面字符
Reverse(pFirstBegin,pSecondEnd);//翻转整个字符串
return str;
}
//以下为最暴力的左旋方法 这也是一般人能想到的最简单的办法就是时间复杂度比较高
void LeftMove1Bit(char *str)//字符串左移一位函数
{
if(str==NULL)
{
return;
}
int length=strlen(str);
char temp=str[0];
for(int i=0;i<length-1;i++)
{
str[i]=str[i+1];
}
str[length-1]=temp;
}
char* LeftRotateString2(char *str,int n)//左旋n位
{
if(str==NULL||n<0)
{
return NULL;
}
for(int i=0;i<n;i++)//循环左移n位
{
LeftMove1Bit(str);
}
return str;
}
int main()
{
cout<<"please input a sentence"<<endl;
char ch[100];
gets(ch);
ReverseSentence(ch);
cout<<ch<<endl;
char test[]="abcdefg";
char test2[]="abcdefg";
char *p;
p=LeftRotateString(test,3);
cout<<p<<endl;
p=LeftRotateString2(test2,3);
cout<<p<<endl;
return 0;
}