给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
1.常规做法
思路:先输入一段话,通过一个for循环将字母一个一个列入二维数组,当遇到空格时停下,然后从第二维开始将字母列入数组;也就是说以空格为边界,每个单词占一个数组,最后倒着输出即可。
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
char str[90];
gets(str);
int len = strlen(str);
int rows = 0, cols = 0, flag = 0;
char words[90][90] = {0}; //注意!!这里一定要初始化,不然会乱码
for(int i = 0; i < len; i++)
{
if(str[i] != ' ')
{
words[rows][cols++] = str[i]; //列入二维数组中
}else{
words[rows][cols] = '\0'; //因为是一个一个单词的列,最后要自己手动添加\0表示结束
++rows; //换下一个数组
cols = 0; //置零,从头开始列
}
}
for(int i = rows; i >= 0; i--) //倒着输出
{
if(flag++)
printf(" ");
printf("%s",words[i]);
}
return 0;
}
2.柳神方法,利用栈。倒着输出,即先进去的后出来,要想到用栈
#include <stack>
#include <string>
#include <iostream>
using namespace std;
int main()
{
stack<string> stk;
string s;
int flag = 0;
while(cin >> s)
{
stk.push(s); //压入栈
}
while(!stk.empty()) //不空的时候输出
{
if(flag++)
cout << " ";
cout << stk.top(); //输出栈顶的字符串
stk.pop(); //栈顶的退栈
}
return 0;
}