1.定义一个字符串,反向拷贝
string ts="";
for(int i=s.length()-1;i+1;i--){
ts+=s[i];
}
2.原地逆序
不分配额外内存空间
//s为string类型
int i=0,j=s.length()-1;
while(i<j){
char c=s[i];
s[i++]=s[j];
s[j--]=c;
}
采用递归
void Reverse( string s, int left, int right )
{
if(left >= right)
return;
char t = s[left] ;
s[left] = s[right] ;
s[right] = t ;
Reverse(s, left + 1, right - 1) ;
}
3.不允许临时变量的原地逆序
利用异或,两个变量相同异或为全0,全0异或任何变量都为变量本身
int i=0,j=s.length()-1;
while(i<j){
s[i]=s[i]^s[j];
s[j]=s[i]^s[j];
s[i]=s[i++]^s[j--];
}
4.单词逆序
给定一个字符串,按单词将该字符串逆序,比如给定"This is a sentence",则输出是"sentence a is This".
分两步
1 先按单词逆序得到"sihT si a ecnetnes"
2 再整个句子逆序得到"sentence a is This"
对于步骤一,关键是如何确定单词,这里以空格为单词的分界。当找到一个单词后,就可以使用上面讲过的方法将这个单词进行逆序,当所有的单词都逆序以后,将整个句子看做一个整体(即一个大的包含空格的单词)再逆序一次即可。
//s中left到right逆序
string ReverseWord(string s,int left,int right)
{
while(left<right){
s[left]=s[left]^s[right];
s[right]=s[left]^s[right];
s[left]=s[left++]^s[right--];
}
return s;
}
//句子按单词逆序
string ReverseSentence(string s)
{
int i=0,j=0;
while(j<s.length()){
if(s[j]==' '){
s=ReverseWord(s,i,j-1);
i=++j;// 指向下一个单词首字符
}
else
j++;
}
s=ReverseWord(s,i,j-1);// 对最后一个单词逆序
s=ReverseWord(s,0,j-1);
return s;// 对整个句子逆序
}
对这道题使用STL栈更简单
stack<string> s;
string ts;
while(cin>>ts){
s.push(ts);
}
while(!s.empty()){
cout<<s.top()<<" ";
s.pop();
}