欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

1009 说反话(字符串、栈)

程序员文章站 2022-05-14 10:34:48
题目: 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。 输出格 ......

题目:

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过 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;
    }