Как распечатать содержимое std:: stack и вернуть его размер?

В c++ как я могу распечатать содержимое моего стека и вернуть его размер?

std::stack<int>  values;
values.push(1);
values.push(2);
values.push(3);

// How do I print the stack?

4 ответов


вы можете сделать копию стека и поп-элементов один за другим, чтобы сбросить их:

#include <iostream>
#include <stack>
#include <string>

int main(int argc, const char *argv[])
{
    std::stack<int> stack;
    stack.push(1); 
    stack.push(3); 
    stack.push(7); 
    stack.push(19); 

    for (std::stack<int> dump = stack; !dump.empty(); dump.pop())
        std::cout << dump.top() << '\n';

    std::cout << "(" << stack.size() << " elements)\n";

    return 0;
}

выход

19
7
3
1
(4 elements)

смотрите, он живет здесь:http://liveworkspace.org/code/9489ee305e1f55ca18c0e5b6fa9b546f


единственный способ распечатать элементы std::stack не открывая их, чтобы написать адаптер, который расширяет std::stack (вот пример). В противном случае вы должны заменить свой стек на std::deque.


и std::stack и std::queue являются обертками вокруг общего контейнера. Этот контейнер доступен как protected . Используя c вы можете приобрести эффективное доступ к элементам; в противном случае вы можете просто скопировать стек или очередь и деструктивно получить доступ к элементам копии.

пример использования c:

#include <iostream>     // std::wcout, std::endl
#include <stack>        // std::stack
#include <stddef.h>     // ptrdiff_t
using namespace std;

typedef ptrdiff_t   Size;
typedef Size        Index;

template< class Elem >
Size nElements( stack< Elem > const& c )
{
    return c.size();
}

void display( stack<int> const& numbers )
{
    struct Hack
        : public stack<int>
    {
        static int item( Index const i, stack<int> const& numbers )
        {
            return (numbers.*&Hack::c)[i];
        }
    };

    wcout << numbers.size() << " numbers." << endl;
    for( Index i = 0;  i < nElements( numbers );  ++i )
    {
        wcout << "  " << Hack::item( i, numbers ) << endl;
    }
}

int main()
{
    stack<int>  numbers;
    for( int i = 1;  i <= 5;  ++i ) { numbers.push( 100*i ); }

    display( numbers );
}

http://www.cplusplus.com/reference/stl/stack/ для размера легко использовать :

cout << mystack.size();

в остальном я ничего не видел в документе, но вы должны распечатать содержимое своего стека, когда вы нажимаете его, или иметь список с ним, чтобы сохранить запись элемента только для того, чтобы распечатать его, не забудьте удалить его, когда вы закончите тестирование