给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
样例:">
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
因为老师要求我们用c++做题,之前用c手写栈被折磨的我打算用c++方便的现成栈来写一下试试,效果还不错 ~
总体逻辑其实就是在读取字符的时候,遇到英文字母就压到栈里面,遇到空格就把栈里面的字母弹出来,这样就可以实现句子反序但是单个单词不反。然后就是一些空格的增加的逻辑。1号测试点是句子的结尾有多的空格,不用慌,在最后输出的时候把前导空格跳过
#include <bits/stdc++.h>
using namespace std;
int main() {
int count = 0,flag=0;
char sen[500000] ;
stack<char> a;
char ch;
while ((scanf("%c", &ch)) != EOF ) {
if (ch == ' '&&ch!='\n') {
while (!a.empty()) {
//每次遇到括号且栈里不为空时弹栈加空格,这个逻辑会导致
结尾有空格的句子输出时带前导空格。
sen[count++] = a.top();
a.pop();
flag=1;
}
if(flag==1){
flag=0;
sen[count++] = ' ';
}
} else if(ch != ' '&&ch!='\n'){
a.push(ch);
}
}
while (!a.empty()) {
sen[count++] = a.top();
a.pop();
}
int fflag=1;
for (--count; count > -1; count--) {
if(sen[count]==' '&&fflag==1){
fflag=0;
continue;
}
else {
fflag=0;
}//以上为略过前导空格
cout << sen[count];
}
return 0;
}
就行了。