c++ で、スタックの内容を出力してそのサイズを返すにはどうすればよいですか?
std::stack<int> values;
values.push(1);
values.push(2);
values.push(3);
// How do I print the stack?
スタックのコピーを作成し、アイテムを 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)
std::stack
とは両方ともstd::queue
、一般的なコンテナーのラッパーです。そのコンテナはprotected
memberとしてアクセスできますc
。c
you を使用すると、要素に効率的にアクセスできます。それ以外の場合は、スタックまたはキューをコピーして、コピーの要素に破壊的にアクセスできます。
使用例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 );
}
a の要素をstd::stack
ポップせずに出力する唯一の方法は、拡張するアダプターを作成することですstd::stack
(ここに例を示します)。それ以外の場合は、スタックをstd::deque
.
「特別なテクニック」を使わずにこれを達成する簡単な方法は、
再帰
pop ()
のメンバー関数がstd::stack<>
使えないなどの制約がないので、以下の再帰アルゴリズムを利用できます。
アルゴリズム:
ポップ操作にもかかわらず、残りのスタックを出力した後、同じ順序でそれらを再度プッシュしているため、スタックはその要素を失うことはありません。
上記のアルゴリズムのコードは次のとおりです。
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;
http://www.cplusplus.com/reference/stl/stack/ サイズについては使いやすいです:
cout << mystack.size();
残りの部分については、ドキュメントには何も表示されませんでしたが、スタックをプッシュするときにスタックの内容を印刷するか、印刷するためだけに要素の記録を保持するためのリストを用意する必要があります。テストが完了したら、削除するのを忘れてください