2016-10-12 2 views
2

Я новичок в C++ и просто изучаю стековый push и pop-операцию. Я написал небольшую программу для нажатия и выталкивания некоторых элементов из стека. Моя программа-пример приведена ниже:Операция push и pop для 2D-матрицы и отображение их в 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 работать и отображать всю матрицу. Как реализовать стек для работы с несколькими матрицами?

Sample матрица может быть такой:

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}}; 
+1

Итак, вы просто используете некоторую структуру данных, представляющую матрицу 3x3, вместо параметра 'int' в качестве шаблона для' std :: stack'. –

+0

Похоже, вам нужно создать класс матрицы. – NathanOliver

+0

Измените тип, хранящийся в стеке, как ваш тип матрицы. – Rob

ответ

2

Вы можете использовать std::array<std::array<float,3>,3> для этого. Простые массивы не будут автоматически скопированы, и не соответствуют требованиям типа данных, хранящихся в 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; 

для того, чтобы сделать его более удобным для чтения и проще набрать можно использовать using или typedef:

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

// ... 

std::stack<My3x3Matrix> myStack; 

myStack.push(A); 

// ... 

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

получив ошибку: слишком много инициализаторов для 'std :: array , 3u>' | @ πάντα ῥεῖ – user6823702

+0

можете ли вы предоставить полный код для операции push и pop на 2D-матрице? @ πάντα ῥεῖ – user6823702

+0

@ user6823702 Извините [исправлено] (http://coliru.stacked-crooked.com/a/f85d5f9354da00a5) –

1

Почему бы просто не использовать Boost.MultiArray?

The classes in this library implement a common interface, formalized as a generic programming concept. The interface design is in line with the precedent set by the C++ Standard Library containers. Boost MultiArray is a more efficient and convenient way to express N-dimensional arrays than existing alternatives (especially the std::vector> formulation of N-dimensional arrays).

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; 
+2

Я не вижу необходимости вводить зависимость для повышения. –

+1

@ πάνταῥεῖ Хорошо, но пусть человек начинает испытывать с усилением. :) –

+1

Я предпочитаю, чтобы они начинались с стандартных материалов C++. –