【问题标题】:Push and pop operation for 2D matrix and displaying them in C++二维矩阵的推送和弹出操作并在 C++ 中显示它们
【发布时间】:2016-10-12 13:50:19
【问题描述】:

我是 C++ 新手,刚刚学习堆栈推送和弹出操作。我编写了一个小程序来从堆栈中推送和弹出一些元素。我的示例程序如下:

// stack::push/pop
#include <iostream>       // std::cout
#include <stack>          // std::stack

int main ()
{
  std::stack<int> mystack;

  for (int i=0; i<5; ++i) mystack.push(i);

  std::cout << "Popping out elements...";
  while (!mystack.empty())
  {
     std::cout << ' ' << mystack.top();
     mystack.pop();
  }
  std::cout << '\n';

  return 0;
} 

但现在我想将多个 3*3 矩阵推入堆栈,并希望使用 mystack.top() 获取每个矩阵,并使用 mystack.pop 操作弹出每个矩阵并显示整个矩阵。如何实现多矩阵运算的堆栈?

样本矩阵可以是这样的:

float A[3][3]={{1.0,2.0,3.0},{1.0,2.0,3.0},{1.0,2.0,3.0}};
float B[3][3]={{1.0,2.0,4.0},{1.0,5.0,3.0},{8.0,2.0,3.0}};

【问题讨论】:

  • 所以您只需使用一些表示 3x3 矩阵的数据结构而不是 int 作为 std::stack 的模板参数。
  • 听起来你需要做一个矩阵类。
  • 将堆栈中存储的类型更改为您的矩阵类型。
  • 你能给我一个演示代码吗?我对这个@Rob 很陌生
  • @user6823702 std::stack&lt;Your_Matrix_Type&gt;。不知道您还需要什么信息。

标签: c++ matrix stack


【解决方案1】:

您可以为此使用std::array&lt;std::array&lt;float,3&gt;,3&gt;。普通数组不会被自动复制,并且不符合存储在 std::queue 中的数据类型的需求:

std::array<std::array<float,3>,3> A {{{1.0,2.0,3.0},{1.0,2.0,3.0},{1.0,2.0,3.0}}};
std::array<std::array<float,3>,3> B {{{1.0,2.0,4.0},{1.0,5.0,3.0},{8.0,2.0,3.0}}};

然后您可以简单地将您的堆栈定义为:

std::stack<std::array<std::array<float,3>,3>> myStack;

为了使其更具可读性和更易于键入,您可以使用usingtypedef

typedef std::array<float,3>,3> My3x3Matrix;

// ...

std::stack<My3x3Matrix> myStack;

myStack.push(A);

// ...

My3x3Matrix C = myStack.top();
myStack.pop();

【讨论】:

  • 出现错误,例如:'std::array<:array>, 3u>' 的初始化程序太多| @πάντα ῥεῖ
  • 能否提供一个完整的二维矩阵push和pop操作代码? @πάντα ῥεῖ
  • @user6823702 对不起fixed it
  • @user6823702 “能否提供完整的代码” 好吧,Stack Overflow 并不是一个代码编写服务。我很确定你足够聪明,可以自己弄清楚。
  • @user6823702 对不起,我在std::stack 声明中有一个愚蠢的错字。现在修好了。但你应该能够很容易地弄清楚这一点。
【解决方案2】:

为什么不直接使用Boost.MultiArray

这个库中的类实现了一个通用接口,形式化 作为一个通用的编程概念。界面设计符合 C++ 标准库容器开创的先例。 Boost MultiArray 是一种比现有替代方案(尤其是 N 维数组的 std::vector> 公式)更有效、更方便的方式来表达 N 维数组。

http://www.boost.org/doc/libs/1_61_0/libs/multi_array/doc/user.html

那么听起来你想拥有以下stack

typedef boost::multi_array<int, 3> array_type;
std::stack<array_type> s;

【讨论】:

  • 我认为不需要引入依赖项来提升。
  • @πάνταῥεῖ 好的,但让男人开始体验 b​​oost.. :)
  • 我更喜欢让他们从 c++ 标准的东西开始。
猜你喜欢
  • 1970-01-01
  • 2015-10-28
  • 2021-12-09
  • 2018-06-12
  • 2018-06-12
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 2021-08-14
相关资源
最近更新 更多