题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。
思路:
(1) 关键死空格符的位置,记录下每个空格符的位置;
(2)字符串逆置是一个普通的问题,我们可以将这个字符串看成多个字符串;
(3)字符串逆置的方法:普通逆序、原地逆序(指针、递归非递归)、异或交换;
#include <iostream>
#include <string>
#include <stack>
using namespace std;
typedef stack<int> STI;
void Reverse(string &str,int base,int top)
{
if ( top == base)
return ;
while ( base < top )
{
str[top] = str[top] ^ str[base];
str[base] = str[top] ^ str[base];
str[top] = str[top] ^ str[base]; // 采用异或的方法交换
top --;
base ++;
}
return ;
}
int main()
{
STI st;
string str;
st.push(-1);
getline(cin,str);
for (int i = 0; str[i] != '\0';i ++)
if (str[i] == ' ')
st.push(i);
int length = i;
int top =0;
int base = length;
while ( !st.empty() )
{
top = base - 1;
base = st.top();
st.pop();
Reverse(str,base+1,top);
}
Reverse(str,0,length-1);
for (i = 0;i < length;i ++)
cout << str[i];
cout << endl;
return 0;
}