c++ - 在 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
但是现在数组从最后一行开始输出。
推荐阅读
- powershell - 如何对巨大的 CSV 文件进行排序?
- asp.net - Azure 上的 ASP NET Angular 部署为任何文件或路由提供了 404 资源未找到
- powershell - 通过 PowerShell 在运行过程中更改 numa 组
- javascript - 使用 geocodeapi.io 的 JQuery 地址自动完成
- drupal - 我的自定义主题的库无法加载 - Drupal 8
- javascript - 异步函数,promise
- javascript - 对数组对象中的多个字段进行排序
- powershell - POwershell CI/CD 错误 Disconnect-AzAccount -Scope Process -ErrorAction Stop , Clear-AzContext -Scope Process -ErrorAction Stop
- javascript - 如何在jQuery“添加另一个字段”功能中更改名称值
- python - Tkinter - 我的自定义图标在打开时“扰乱”顶级窗口