PAT乙级1009

128 阅读1分钟

image.png 首先是常规思路,用一个二维数组来存单词。一个单词占据一行的位置。每一行一'\0'结束。然后倒序输出这个二维字符数组。注意处理一下末尾的空格。

//测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

string s;
char a[85][85];//用来存单词,一行一个
int m,n;//行,列
int main(){
    getline(cin,s);//输入字符串,getline包含在#include<string>中
    
    for(int i = 0; i < s.size(); i ++){
        if(s[i] != ' ') 
            a[m][n ++] = s[i];
        else{
            a[m ++][n] = '\0';//有一个空格了,单词存在下一行
            n = 0;//n 归零,下一个单词要在下一行重新存
        }
    }

    for(int i = m; i >= 0; i --){//倒序输出单词
        cout << a[i];//输出一整个单词
        if(i != 0)
            cout << " ";//最后不能输出空格
    }

    cout << endl;
    return 0;
}

倒序输出,就不得不想到栈,这样只从一段出入是不是和栈很像。所以我们使用STL库中的stack来完成题目,:将输⼊的每个单词s都分别v.push(s)压⼊栈中,再输出栈顶v.top(),然后将栈顶元素弹出v.pop(),直到栈空为⽌:

//foreverking
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
#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;
}

题目链接