如何在C ++中使用堆栈来反转字符串中单词的顺序

时间:2015-08-27 20:42:45

标签: c++ stack

我试图在C ++中使用Stack来反转字符串中包含的单词的顺序,但是我在最终输出中的字符串开头有空格。

请帮我找出错误并解决。

这是我的代码:

$db->value('ooactive', 'string')

输入:

#include <iostream>
#include <stack>
#include <string>
using namespace std;

int main()
{
    int number;
    cin >> number; // number of strings to reverse

    for(int i = 0; i <= number; i++)
    {
        string str;
        getline(cin, str); // input

        std::stack<std::string> s; //stack
        string str1 = "";

        for(int i = 0; i <= str.length(); i++)
        {
            if(str[i] == ' ' || str[i] == '\0')
            { // add the word whenever it encounters a space
                s.push(str1); //push the string
                str1 = "";
            }
            else
                str1 += str[i];
        }

        while(!s.empty())
        { // output
            cout << s.top(); // simple displaying without space
            cout << " ";
            s.pop();
        }
    }

    cout << '\n';
}

输出:

2
Reverse this String
OOP and DS

预期产出:

         String this Reverse 
DS and OOP 

1 个答案:

答案 0 :(得分:1)

您已接近解决方案,但您遇到了一种不直观的行为。您的问题是,当您cin数字时,您在结尾处按下的回车键也会被以下getline占用,从而导致空字符串。所以getline总共给你3个字符串,这显然不是你想要的:你想要2,第一个是“反转这个字符串”,第二个是“OOP和DS”,仅此而已。你所做的就是使用3,因为开头有一个“幽灵”。你使用i循环的“奇怪”退出条件(通常使用i<number,但你使用了i<=number),这让我觉得你必须注意到你经历了2次迭代正在跳过“OOP和DS”,你试图解决问题,但是你找到了一种解决方法而不是应用正确的解决方案。

正如其他人所说,您可以添加cin.ignore(10000,'\n');来解决问题。这样,getline将捕获适量的行(即2)。然后你必须恢复正确的退出条件,即

for(int i = 0; i < number; i++)

另一个循环看起来也很可疑:

for(int i = 0; i <= str.length(); i++)

在这里你做了同样的事情(你使用<=而不是<)但事实证明它没问题,因为你正在读取字符串结尾后的一个字符,这将给你终止你正在检查的字符'\ 0',所以没关系。

除此之外,我刚刚在打印完每条恢复的行之后移动了for {循环中的cout << endl;。哦,我已经将内循环的变量从i更改为j:最好避免重用相同的名称(外部循环已使用i),因为它们可能会令人困惑(尽管在这种情况下它们运作良好)。

这是最终的结果(我添加了几个cout用于调试,我离开了,虽然已注释):

#include <iostream>
#include <stack>
#include <string>
using namespace std;

int main()
{
    int number;
    cin >> number; // number of strings to reverse
    cin.ignore(10000,'\n');

    for(int i = 0; i < number; i++)
    {
        string str;
        getline(cin, str); // input
        //cout << "Debug: i = " << i << ", string = " << str << endl;

        std::stack<std::string> s; //stack
        string str1 = "";

        for(int j = 0; j <= str.length(); j++)
        {
            if(str[j] == ' ' || str[j] == '\0')
            { // add the word whenever it encounters a space
                //cout << "Pushing '" << str1 << "'" << endl;
                s.push(str1); //push the string
                str1 = "";
            }
            else
                str1 += str[j];
        }

        while(!s.empty())
        { // output
            cout << s.top(); // simple displaying without space
            cout << " ";
            s.pop();
        }
        cout << endl;
    }

}