题意:



方法一:
模拟

思路:
        直接模拟。
        遍历字符串,将单词提取出来。
        最后逆向输出单词。



#include <bits/stdc++.h>

using namespace std;

int main(){
    string s;
    getline(cin,s);
    
    int len=s.size();
    vector<string> v;
    string x="";
    for(int i=0;i<len;i++){//遍历
        if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')){//如果是字母,则组成单词
            x+=s[i];
        }else{//否则,如果x非空,则收集一个单词
            if(x!=""){
                v.push_back(x);
                x="";
            }
               
        }
    }
    if(x!=""){
        v.push_back(x);
        x="";
    }
    
    for(int i=v.size()-1;i>=0;i--){//逆向输出
        cout << v[i] << " ";
    }
    
    return 0;
}

时间复杂度:
空间复杂度:

方法二:
stringstream类

思路:
        stringstream可以分割以空格作为分隔符的字符串。
        因此,可以先将非字母的字符变为空格,然后利用stringstream分割字符串。

#include <bits/stdc++.h>

using namespace std;

int main(){
    string s;
    getline(cin,s);
    
    int len=s.size();
    for(int i=0;i<len;i++){//将非字母的字符变为空格
        if(!isalpha(s[i]))
            s[i]=' ';
    }
    vector<string> v;//单词数组
    stringstream ss(s);//stringstream可以分割以空格作为分隔符的字符串
    string x;
    while(ss >> x){
        v.push_back(x);
    }
    
    for(int i=v.size()-1;i>=0;i--){//逆向输出
        cout << v[i] << " ";
    }
    
    return 0;
}

时间复杂度:
空间复杂度: