1009 说反话 (20 分)
一.题目:
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
二.题解:
解法一:
将输入字符串翻转,再把每个单词内部翻转,即可得到输出
Step1.Hello World Here I Come
Step2.emoC I ereH dlroW olleH
Step3.Come I Here World Hello
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int main()
{
string s,s1;
while(cin>>s1)
{
s+=' '+s1;
}
//在输入时,cin遇到空格就停止输入,所以只能一段一段读入,最后拼接起来
int len=s.length();
vector<char>str(len);
for(int i=0; i<len; i++)
{
str[i]=s[i];
}
reverse(str.begin(),str.end());//整体翻转
int tmp=0;
for(int i=0; i<len; i++)
{
if(str[i]==' ')
{
reverse(str.begin()+tmp,str.begin()+i);//单词内部翻转
tmp=i+1;
}
}
for(int i=0; i<len-1; i++)//这里注意为了让i<len-1不输出最后的‘ ’
{
printf("%c",str[i]);
}
return 0;
}
运行结果
为了让大家更好看清楚把‘ ’换成了’~’
这里注意while循环的终止
终止输入的方式:
windows系统下使用ctrl+Z
linux系统下使用ctrl+D
解法二:
在这里使用了栈这个数据结构,栈是限定在表的一端进行插入和删除的运算的线性表,通常将插入、删除的一端称为栈顶,另一端称为栈底。不含元素的空表称为空栈。栈的操作具有先进后出或后进先出的特点。
将输⼊的每个单词s都依次压⼊栈中,然后将栈顶元素依次弹出,直到栈空为⽌
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <stack>
using namespace std;
int main()
{
stack<string>str;
string s;
while(cin>>s){
str.push(s);
}
int flag=0;
while(!str.empty()){
if(flag){
cout<<" ";
}
cout<<str.top();
str.pop();
flag=1;
}
return 0;
}