给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
总结:
以空格作为相关字符分割的标志。
代码:
第一种:从字符串尾部进行遍历,记录空格对应的位置,从而实现倒序单词输出。
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
string textStr;
getline(cin, textStr); // 获取带空格的字符串
vector<int> v;
int i, len = textStr.length();
for(i=len-1;i>=0;i--) {
if( textStr[i] == ' ' ) {
v.push_back(i); // 记录对应空格的下标
textStr[i] = '\0'; // 将其替换为输出结束符
}
}
for(int i=0;i<v.size();i++) { // 按序输出
printf("%s ",&textStr[ v[i]+1 ]); // 注:从 字符串 的元素地址开始打印字符串,直到遇到 \0 结束符
}
printf("%s\n",&textStr[0]);
return 0;
}
第二种:利用 vector 容器。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
string temp;
vector<string> v;
while(cin >> temp)
v.push_back(temp);
int flag = 0;
for(auto rit=v.rbegin();rit!=v.rend();rit++) {
if( flag == 1 )
printf(" ");
cout << *rit;
flag = 1;
}
return 0;
}
第三种:参考相关资料之后,知道可以利用 栈 来实现 后进先出。
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
int main()
{
stack<string> s; // 使用 栈 容器,后进先出
string temp;
while(cin >> temp) { // 循环输入,终结方法,crtl + z + 回车
s.push(temp); // 进栈
}
cout << s.top(); // 访问 栈首元素
s.pop(); // 删除 栈首元素
while( !s.empty() ) { // 当 栈 不为空的时候
cout << " " << s.top(); // 注意 空格
s.pop();
}
return 0;
}