C++のSTLでキューを実装するプログラムの書き方と解説
キュー(Queue)とは
キューは、先入れ先出し(FIFO: First In First Out)の順序で要素に対する操作が行われる線形データ構造です。最初に挿入された要素が最初に取り出されるという特性を持ち、タスク管理やバッファ処理など、さまざまな場面で活用されています。
C++の標準テンプレートライブラリ(STL)には、キューを手軽に扱える std::queue コンテナアダプタが用意されています。これを利用すれば、データ構造を自前で実装することなく、効率的にキュー操作を行うことができます。
使用する主な関数
ここで使用する関数:
q.size() = キューのサイズ(要素数)を返します。
q.push() = キューの末尾に要素を挿入します。
q.pop() = キューの先頭から要素を取り除きます。
q.front() = キューの先頭要素を返します。
q.back() = キューの末尾要素を返します。サンプルコード
#include<iostream>
#include <queue>
#include <string>
#include <cstdlib>
using namespace std;
int main() {
queue<int> q;
int c, i;
while (1) {
cout<<"1.キューのサイズを表示"<<endl;
cout<<"2.キューに要素を挿入"<<endl;
cout<<"3.キューから要素を削除"<<endl;
cout<<"4.キューの先頭要素を表示"<<endl;
cout<<"5.キューの末尾要素を表示"<<endl;
cout<<"6.終了"<<endl;
cout<<"選択してください: ";
cin>>c;
switch(c) {
case 1:
cout<<"キューのサイズ: ";
cout<<q.size()<<endl;
break;
case 2:
cout<<"挿入する値を入力: ";
cin>>i;
q.push(i);
break;
case 3:
i = q.front();
q.pop();
cout<<"要素 "<<i<<" を削除しました"<<endl;
break;
case 4:
cout<<"キューの先頭要素: ";
cout<<q.front()<<endl;
break;
case 5:
cout<<"キューの末尾要素: ";
cout<<q.back()<<endl;
break;
case 6:
exit(1);
break;
default:
cout<<"無効な選択です"<<endl;
}
}
return 0;
}実行結果
1.キューのサイズを表示 2.キューに要素を挿入 3.キューから要素を削除 4.キューの先頭要素を表示 5.キューの末尾要素を表示 6.終了 選択してください: 1 キューのサイズ: 0 1.キューのサイズを表示 2.キューに要素を挿入 3.キューから要素を削除 4.キューの先頭要素を表示 5.キューの末尾要素を表示 6.終了 選択してください: 2 挿入する値を入力: 1 1.キューのサイズを表示 2.キューに要素を挿入 3.キューから要素を削除 4.キューの先頭要素を表示 5.キューの末尾要素を表示 6.終了 選択してください: 2 挿入する値を入力: 2 1.キューのサイズを表示 2.キューに要素を挿入 3.キューから要素を削除 4.キューの先頭要素を表示 5.キューの末尾要素を表示 6.終了 選択してください: 3 要素 1 を削除しました 1.キューのサイズを表示 2.キューに要素を挿入 3.キューから要素を削除 4.キューの先頭要素を表示 5.キューの末尾要素を表示 6.終了 選択してください: 2 挿入する値を入力: 4 1.キューのサイズを表示 2.キューに要素を挿入 3.キューから要素を削除 4.キューの先頭要素を表示 5.キューの末尾要素を表示 6.終了 選択してください: 2 挿入する値を入力: 7 1.キューのサイズを表示 2.キューに要素を挿入 3.キューから要素を削除 4.キューの先頭要素を表示 5.キューの末尾要素を表示 6.終了 選択してください: 2 挿入する値を入力: 6 1.キューのサイズを表示 2.キューに要素を挿入 3.キューから要素を削除 4.キューの先頭要素を表示 5.キューの末尾要素を表示 6.終了 選択してください: 4 キューの先頭要素: 2 1.キューのサイズを表示 2.キューに要素を挿入 3.キューから要素を削除 4.キューの先頭要素を表示 5.キューの末尾要素を表示 6.終了 選択してください: 5 キューの末尾要素: 6 1.キューのサイズを表示 2.キューに要素を挿入 3.キューから要素を削除 4.キューの先頭要素を表示 5.キューの末尾要素を表示 6.終了 選択してください: 6 終了コード: 1
コードの解説
このプログラムは、メニュー方式のインターフェースを採用しており、ユーザーが選択した番号に応じてキューの各操作を switch 文で振り分けて実行します。
- size():現在キューに格納されている要素数を取得します。
- push():キューの末尾(back側)に新しい要素を追加します。
- pop():キューの先頭(front側)の要素を削除します。戻り値を持たないため、削除前に
front()で値を取得して表示しています。 - front():先頭要素の値を参照します。実行結果から、最初に挿入した要素が先に削除されるFIFOの動作が確認できます。
- back():末尾要素の値を参照します。最後に挿入した要素が返されることがわかります。
なお、空のキューに対して pop() や front() を呼び出すと未定義動作となるため、実用的なコードでは empty() 関数による空チェックを追加することが推奨されます。
-
C++のSTLでset_intersectionを実装し、2つの集合の積集合を求める方法
2つの集合の積集合(インターセクション)とは、両方の集合に共通して含まれる要素だけを集めたものです。set_intersection関数によってコピーされる要素は、必ず最初の集合から取り出され、元の順序がそのまま維持されます。また、この関数を正しく動作させるためには、処理前に両方の集合がそれぞれソート済みである必要があります。 集合に対する代表的な操作には、以下のようなものがあります。 和集合(ユニオン) 積集合(インターセクション) 対称差(排他的論理和・XOR) 差集合(減算) アルゴリズム Begin 結果を格納するvector型変数vとイテレータstを宣言する。 st =
-
【C++】STLのset_differenceを使って2つの集合の差分を求める方法
2つの集合の「差(差集合)」とは、1つ目の集合には存在するが、2つ目の集合には存在しない要素だけから構成される集合のことです。set_difference関数によってコピーされる要素は、必ず1つ目の集合から取り出され、元の順序が保たれます。また、この関数を正しく動作させるためには、両方の集合があらかじめソート(整列)されている必要があります。代表的な集合演算には以下のようなものがあります。和集合(Union)積集合(Intersection)対称差(Symmetric Difference / 排他的論理和)差集合(Difference / 減算)アルゴリズムBegin 集合用のvec