簡體   English   中英

在 C++ 中以錯誤的順序打印堆棧

[英]printing stack in the incorrect order in c++

我有一個函數將所有非零整數下推到數組的頂部,然后在 3x3 矩陣中重新打印它。 我遇到的問題是,當我將所有非零整數推入堆棧時,它會顛倒順序。

** 我的數組的索引是向后的。 即,在 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;
}

這是我當前的輸出:

前下推功能

045
504
226

下推功能后:

006
224
545

正如你所看到的,它成功地將非零元素推送到矩陣的底部,但是在這個過程中它顛倒了其他數字的順序,我相信這是因為堆棧。

我的預期輸出如下:

前下推功能

045
504
226

下推功能后:

005
544
226

我的問題是 - 我如何修復我的函數,以便元素的順序保持不變而不顛倒。

這是一個演示程序,顯示了如何定義循環。

#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 

但是現在數組從最后一行開始輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM