题目:
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
思路:
第一反应是这样的:getline接收这句话,遍历该字符串,将所有空格的下标记入一个vector,然后遍历vector,用substr截取字符串,组合成一个新字符串。需要注意的是,要考虑到没有空格也就是vector为空的情况,不然会出现段错误。 心里清楚这肯定不是最好的办法,所以看了一下网上别人的解法:逆序输出,会想到栈这个数据结构。然后就把每个单词看做一个字符串,按顺序放到栈里去。输出的时候依次出栈,就好了。 之前我没有用过c++里面的stack,所以也没想到这种操作。在下面把两种代码都贴上。
知识点for me:
1、有几个测试点是段错误,可能是因为没有考虑0或者边界值的情况,比如对于一个空数组却访问了arr[0]。
2、
#include <iostream> #include <stack> using namespace std; int main() { stack<int> s; // 定义⼀个空栈s for (int i = 0; i < 6; i++) { s.push(i); // 将元素i压⼊栈s中 } cout << s.top() << endl; // 访问s的栈顶元素 cout << s.size() << endl; // 输出s的元素个数 s.pop(); // 移除栈顶元素 return 0; }
上代码:
字符串的方法:
#include <iostream> #include <vector> #include <string> using namespace std;; int main() { string s,cut,ans; getline(cin,s); vector<string> v; vector<int> k; for(int i=0;i<s.length();i++) { if(s[i]==' '){ k.push_back(i); } } if(k.size()==0)//k为空 { cout<<s; return 0; } ans=s.substr(k[k.size()-1]+1); for(int i=k.size()-2;i>=0;i--) { ans+=s.substr(k[i],k[i+1]-k[i]); } ans+=" "; ans+=s.substr(0,k[0]); cout<<ans; return 0; }
使用stack:
#include <iostream> #include <stack> using namespace std; int main() { stack<string> v; string s; while(cin >> s) { v.push(s); } cout << v.top(); v.pop(); while(!v.empty()) { cout << " " << v.top(); v.pop(); } return 0; }