【问题标题】:printing stack in the incorrect order in c++在 C++ 中以错误的顺序打印堆栈
【发布时间】:2020-03-31 23:43:03
【问题描述】:

我有一个函数可以将所有非零整数下推到我的数组顶部,然后在 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

我的问题是 - 我怎样才能修复我的函数,以便元素的顺序保持不变而不反转。

【问题讨论】:

  • 你试过只使用队列吗?
  • 抱歉忘记添加我正在关注想要使用堆栈的大学任务。我尝试了一个我工作的队列,因为我可以使用 front() 属性但是在这种情况下我不能使用队列
  • @elie1 -- 我试过它会是一个我工作的队列 -- 然后使用两个堆栈创建一个队列。把它变成一个类,放一个front 成员函数,你就完成了。从两个堆栈创建队列的代码很简单。
  • 另外,也许我建议的是给你的任务的目标。换句话说,以一种偷偷摸摸的迂回方式,您应该使用堆栈来创建队列。

标签: c++ loops for-loop stack


【解决方案1】:

这是一个演示程序,展示了如何定义循环。

#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 

但是现在数组是从最后一行开始输出的。

【讨论】:

  • 我只使用我的堆栈来重新填充我的数组,然后像往常一样打印我的数组。但是我使用了代码的关键组件,但是我得到的输出将零推到底部而不是顶部-请记住,在重新格式化之前的输出中,坐标 0,0 的值是 2 而不是 0
  • @elie1 没看懂。我的演示程序的输出不正确吗?
  • 您的程序输出不正确。虽然排序正确,但零显示在矩阵的最后一行而不是顶部
  • @elie1 你错了。演示程序按原样输出结果矩阵。
  • 我完全复制了代码,零在底部而不是顶部
猜你喜欢
  • 2017-08-15
  • 2020-08-28
  • 2021-05-27
  • 1970-01-01
  • 2022-01-11
  • 2015-03-22
  • 2019-01-07
  • 2021-06-08
相关资源
最近更新 更多