9

c++ で、スタックの内容を出力してそのサイズを返すにはどうすればよいですか?

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

// How do I print the stack?
4

6 に答える 6

21

スタックのコピーを作成し、アイテムを 1 つずつダンプしてダンプできます。

#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

于 2012-09-27T23:32:43.970 に答える
5

std::stackとは両方ともstd::queue、一般的なコンテナーのラッパーです。そのコンテナはprotectedmemberとしてアクセスできますccyou を使用すると、要素に効率的にアクセスできます。それ以外の場合は、スタックまたはキューをコピーして、コピーの要素に破壊的にアクセスできます。

使用例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 );
}
于 2012-09-28T00:01:12.267 に答える
4

a の要素をstd::stack ポップせずに出力する唯一の方法は、拡張するアダプターを作成することですstd::stack(ここに例を示します)。それ以外の場合は、スタックをstd::deque.

于 2012-09-27T23:43:46.907 に答える
1

「特別なテクニック」を使わずにこれを達成する簡単な方法は、

再帰

pop ()のメンバー関数がstd::stack<>使えないなどの制約がないので、以下の再帰アルゴリズムを利用できます。

アルゴリズム:

  1. 基本ケース: スタックが空の場合 => 戻ります。
  2. 最上位の要素をポップして、変数に格納します。
  3. 保存された値を出力します。
  4. スタックの残りの要素を再帰的に呼び出します。
  5. 要素をスタックに再度プッシュします。

ポップ操作にもかかわらず、残りのスタックを出力した後、同じ順序でそれらを再度プッシュしているため、スタックはその要素を失うことはありません。

上記のアルゴリズムのコードは次のとおりです。

void printStack (std::stack <int> &values) {
    
    if (values.empty ()) {
        return;
    }

    int topElement = values.top ();
    values.pop ();

    std::cout << topElement << std::endl;

    printStack (values);

    values.push (topElement);
}

上記のコードの出力:

3
2
1

これは要素を上から下に印刷します。

要素を下から上に出力したい場合は、再帰呼び出しとstd::coutステートメントを切り替えるだけです。

void printStack (std::stack <int> &values) {
    
    if (values.empty ()) {
        return;
    }

    int topElement = values.top ();
    values.pop ();

    printStack (values);

    std::cout << topElement << std::endl;

    values.push (topElement);
}

出力:

1
2
3

size ()メンバー関数をstd::stack<>使用して、スタックのサイズを取得できます。

std::cout << values.size () << std::endl;
于 2021-03-02T02:36:26.590 に答える
-1

http://www.cplusplus.com/reference/stl/stack/ サイズについては使いやすいです:

cout << mystack.size();

残りの部分については、ドキュメントには何も表示されませんでしたが、スタックをプッシュするときにスタックの内容を印刷するか、印刷するためだけに要素の記録を保持するためのリストを用意する必要があります。テストが完了したら、削除するのを忘れてください

于 2012-09-27T23:32:40.247 に答える