7-32 说反话-加强版

7-32 说反话-加强版(20 分)

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

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。

输出格式:

每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。

输入样例:

Hello World   Here I Come

输出样例:

Come I Here World Hello
思路:递归—倒着遍历字符串遇到下个字符非空格就继续进行递归,否则输出该字符,试了下但是超时了!然后就用栈重写了一遍,遇到不是空格就入栈,否则将栈全部输出,至于细节处理还是看代码吧。
提供第三个测试点的一组数据:
输入样例:
      a       
输出样例:
a
注意前后没有多余空格!

递归代码如下:
#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
int f(string s, int pos, int len=0)
{
    if (pos == 0){                        //当碰到第一个字符时,输出并返回
        cout << s[pos];
        return 1;
    }

    if (s[pos - 1] == ' '){
        cout << s[pos];            //当下一个字符为空格时,输出并返回
        return 1;
    }
        
    
    int flag = 1 + f(s, pos - 1, len + 1);            //flag为当前的单词长度
    cout << s[pos];
    return flag;
}
int main()
{
    string line;
    getline(cin, line);
    string container;
    int first = 0;                                //first用来解决空格输出,第一个单词不输出空格
    for (int i = line.length() - 1; i >= 0; i--)
    {
        int flag = 0;
        if (line[i] != ' '){                
            if (first != 0) cout << " ";            
            flag = f(line, i);
            i -= flag;                //一个单词输出后,该单词的字符将不进行你个查询
            first++;

        }
    
    }
    cout << endl;
    return 0;
}
递归写法

AC代码如下:

#include<stdio.h>
#include<string>
#include<stack>
#include<iostream>
using namespace std;
int main()
{
    string line;
    getline(cin, line);
    stack<char> cnt;                        //借用栈来保存字符
    
    int first = 0;                                //first用来解决空格输出,第一个单词不输出空格
    for (int i = line.length() - 1; i >= 0; i--)
    {
        
        if (line[i] != ' '&&i!=0)                
            cnt.push(line[i]);
        else {
            if (first != 0&&!cnt.empty()) cout << " ";
            if (i == 0 && line[0] != ' ') cnt.push(line[0]);

            int flag = 0;
            while (!cnt.empty()){                        //遇到空格或者i=零,只要栈非空则输出
                cout << cnt.top();
                cnt.pop();
                flag = 1;
            }

            if (flag==1)                            //只有单词输出才能加一
                first++;
        }

    }
    cout << endl;
    return 0;
}

如果有不懂得栈的,推荐以下

http://blog.csdn.net/wallwind/article/details/6858634

原文地址:https://www.cnblogs.com/zengguoqiang/p/8336665.html