如何以相反的顺序读取 C++ 程序的输入?

How to read input to a C++ program in reverse order?

假设我按如下方式向 C++ 程序输入:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

C++代码:

int n;
for (int i = 0; i < 15; i++)
{
    std::cin >> n;
    // use the value of n to make changes
}

在上面的代码中我可以顺序读取输入, 即 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15.

有没有办法按以下顺序从输入流中直接读取输入(不使用 C++ 程序中的额外内存):

5 4 3 2 1 10 9 8 7 6 15 14 13 12 11

倒序的前五位数字 5 4 3 2 1,倒序的后五位数字 10 9 8 7 6,...

没有.

您需要在数据流入输入流时读取它们。

然后在您的程序中,您可以按照您喜欢的任何方式重新排序它们。

如评论中所述,最好的方法是按照给定的顺序阅读它们,然后再对它们进行排序。

// vector to hold the values
std::vector<int> values;
values.reserve(15); // reserve for better performance

int n;
for (int i = 0; i < 15; i++)
{
    std::cin >> n;
    values.push_back(n); // add value to back of vector
}

// sort the vector
std::sort(values.begin(), values.end());

// use the values in ascending order...
for (int i = 0; i < 15; i++) {
    std::cout << values[i];    
}

是的,这是可能的,但它增加了代码的 运行 时间复杂度。

首先你可以让外循环插入多少系列,在上面的测试用例中它是 3.

其次,您可以创建一个内部循环,将数字相加。

我不确定代码是否 运行 但逻辑可以帮助你。

我正在使用堆栈实现伪代码!

int n=5;
for(int count = 1 ; count <= 3 ;count++)
{
   for(int i=n ; i > n-5 ; i++)
    {
      push_on_stack(i);
    }
 n=n+5;
}

您需要将接受的输入包装在一些为您重新排序值的功能中。您也许可以在程序之外这样做,即通过另一个对值进行重新排序的程序来传输输入流。那么您的代码可能已经可以正常工作了。

或者你在你的程序中做这个包装。例如,使用类似自定义流的 class 来缓冲介于两者之间的值。

如果不使用额外的内存来缓冲您还不需要的值,就无法完成此操作。

示例:

#include <iostream>
#include <stack>

struct reader {
    std::stack<int> data;
    reader& operator>>(int & i) {
        if (data.empty()) {
            while (data.size() < 5) {
                data.push(0);
                std::cin >> data.top();
            }
        }
        i = data.top();
        data.pop();
        return *this;
    }
    explicit operator bool() const { return bool(std::cin); }
};

int main () {
    reader r;
    int i;
    while (r >> i) {
        std::cout << i << std::endl;
    }
}

示例输出:

$ g++ tt.cc -std=c++11 && echo "1 2 3 4 5 6 7 8 9 10" | ./a.out
5
4
3
2
1
10
9
8
7
6

更直接的方法可能是这样的:

#include <iostream>
#include <vector>

int main () {
    std::vector<int> buffer;
    for (int i; std::cin >> i; ) {
        buffer.push_back(i);
        if (buffer.size() == 5) {
            // do something with buffer
            //std::vector<int> reversed(buffer.rbegin(), buffer.rend());
            while (!buffer.empty()) {
                std::cout << buffer.back() << "\n";
                buffer.pop_back();
            }
        }
    }
}