стек печати в неправильном порядке в c ++ - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть функция, которая помещает все ненулевые целые числа в начало моего массива, а затем перепечатывает его в матрице 3x3 проблема, которую я имею, состоит в том, что когда я помещаю sh все ненулевые целые числа в мой стек, он меняет порядок.

** индексация моего массива обратная. ie, в матрице 3x3 координаты (0,0) будут слева внизу **

вот соответствующий код:

  void State::pushDown() {


  std::stack<int> tempStack;

    for ( int c = 0; c < BOARDSIZE; c++ )
    {
        for ( int r = 0; r < BOARDSIZE ; r++ )
        {
            if ( grid[r][c] != 0 ) tempStack.push( grid[r][c] );
        }

        for ( int r = BOARDSIZE; r != 0; --r )
        {
            if ( !tempStack.empty() )
            {
                grid[r-1][c] = tempStack.top();
                tempStack.pop();
            }
            else
            {
                grid[r-1][c] = 0;
            }
        }
    }

}
State() {
        for (int i = 0; i < BOARDSIZE; i++)
            for (int j = 0; j < BOARDSIZE; j++)
                grid[i][j] = rand() % 7;

    }

void State::printBoard() {
    cout << endl;

    for (int i = 0; i < BOARDSIZE; i++) {
        for (int j = 0; j < BOARDSIZE; j++) {
            cout << " " << grid[BOARDSIZE - i - 1][j] << " ";
        }
        cout << endl;
    }
}

int main() {
    srand(time(0));

    State state;
    state.printBoard();

    state.pushDown();
    state.printBoard();



    return 0;
}

вот мой текущий вывод:

до функции pu sh down

045
504
226

после функции pu sh down:

006
224
545

, как вы можете видеть, успешно удаляет ненулевые элементы в однако нижняя часть матрицы в процессе меняет порядок других чисел, и я считаю, что это из-за стека.

мой ожидаемый результат будет следующим:

перед пу sh функция отключения

045
504
226

после операции pu sh функция отключения:

005
544
226

Мой вопрос: как я могу исправить свою функцию, чтобы порядок элементов оставался прежним без реверса.

1 Ответ

0 голосов
/ 01 апреля 2020

Вот демонстрационная программа, которая показывает, как можно определить циклы.

#include <iostream>
#include <stack>

const int BOARDSIZE = 3;

void reformat( int ( &a )[BOARDSIZE][BOARDSIZE] )
{
    std::stack<int> tempStack;

    for ( int c = 0; c < BOARDSIZE; c++ )
    {
        for ( int r = 0; r < BOARDSIZE ; r++ )
        {
            if ( a[r][c] != 0 ) tempStack.push( a[r][c] );
        }

        for ( int r = BOARDSIZE; r != 0; --r )
        {
            if ( !tempStack.empty() )
            {
                a[r-1][c] = tempStack.top();
                tempStack.pop();
            }
            else
            {
                a[r-1][c] = 0;
            }
        }
    }
}

int main() 
{
    int a[BOARDSIZE][BOARDSIZE] =
    {
        { 0, 4, 5 },
        { 5, 0, 4 },
        { 2, 2, 6 }
    };


    for ( const auto &row : a )
    {
        for ( const auto &item : row ) std::cout << item << ' ';
        std::cout << '\n';
    }

    std::cout << '\n';

    reformat( a );

    for ( const auto &row : a )
    {
        for ( const auto &item : row ) std::cout << item << ' ';
        std::cout << '\n';
    }

    std::cout << '\n';

    return 0;
}

Его вывод

0 4 5 
5 0 4 
2 2 6 

0 0 5 
5 4 4 
2 2 6 

Если вы выводите массив, начиная с его последней строки, то используйте следующие циклы

#include <iostream>
#include <stack>

const int BOARDSIZE = 3;

void reformat( int ( &a )[BOARDSIZE][BOARDSIZE] )
{
    std::stack<int> tempStack;

    for ( int c = 0; c < BOARDSIZE; c++ )
    {
        for ( int r = 0; r < BOARDSIZE ; r++ )
        {
            if ( a[BOARDSIZE-r-1][c] != 0 ) tempStack.push( a[BOARDSIZE-r-1][c] );
        }

        for ( int r = 0; r != BOARDSIZE; ++r )
        {
            if ( !tempStack.empty() )
            {
                a[r][c] = tempStack.top();
                tempStack.pop();
            }
            else
            {
                a[r][c] = 0;
            }
        }
    }
}

int main() 
{
    int a[BOARDSIZE][BOARDSIZE] =
    {
        { 2, 2, 6 },
        { 5, 0, 4 },
        { 0, 4, 5 }
    };


    for ( size_t i = 0; i < BOARDSIZE; i++  )
    {
        for ( const auto &item : a[BOARDSIZE - i - 1] ) std::cout << item << ' ';
        std::cout << '\n';
    }

    std::cout << '\n';

    reformat( a );

     for ( size_t i = 0; i < BOARDSIZE; i++  )
    {
        for ( const auto &item : a[BOARDSIZE - i - 1] ) std::cout << item << ' ';
        std::cout << '\n';
    }

    std::cout << '\n';

    return 0;
}

Вывод программы такой же, как показано выше

0 4 5 
5 0 4 
2 2 6 

0 0 5 
5 4 4 
2 2 6 

Но теперь массив выводится, начиная с последней строки.

...