2018年02月04日
《その275》 vector<>で実現するスタック
vector<>クラステンプレート
vector<>クラステンプレートは、<vector>ヘッダで提供される配列クラステンプレートです。
・配列サイズの増減が可能
・末尾への要素の追加・削除が高速
・各要素を記憶域上に、線形に連続して格納
等の特徴をもっています。
C++ の標準ライブラリでは、vector<>以外にも多くの
テンプレートライブラリ STL(Standard Template Library)が提供されています。
今回のプログラムでは、vector<>の次のような特徴・機能を使っています。
・オブジェクトの宣言時に、要素数の指定が不要
・push_back関数による、末尾へ要素追加
・back関数による、末尾要素への参照取得
・pop_bak関数による、末尾要素の削除
・empty関数による、空かどうかの判定
以下がプログラムです。
#include <vector>
#include <iostream>
using namespace std;
// ------------------------------------
// 抽象クラステンプレート Stack<>
template <class Type> class Stack {
public:
class Overflow { }; // Overflow例外
class Empty { }; // Empty例外
// 純粋仮想デストラクタ
virtual ~Stack() = 0;
// 純粋仮想関数 push
virtual void push(const Type&) = 0;
// 純粋仮想関数 pop
virtual Type pop() = 0;
};
template <class Type>
Stack<Type>::~Stack() { }
// ------------------------------------
// テンプレートライブラリ vector<>
// によるスタック VectorStack<>
template <class Type> class VectorStack
: public Stack<Type> {
// データメンバとしての
// べクトルオブジェクト stk の宣言
vector<Type> stk;
public:
// コンストラクタ
VectorStack() { }
// デストラクタ
~VectorStack() { }
// push
void push(const Type& x) {
try {
// 末尾へ要素追加(push_back関数)
stk.push_back(x);
}
catch (...) {
throw Stack<int>::Overflow();
}
}
// pop
Type pop() {
// 要素が空かどうかの判定(empty関数)
if (stk.empty())
throw Stack<int>::Empty();
// 末尾要素を取得(back関数)
Type x = stk.back();
// 末尾要素の削除(pop_back関数)
stk.pop_back();
return x;
}
};
// ------------------------------------
int main() {
// スタック s を生成。
VectorStack<char> s;
while (1) {
int menu;
cout << "◆ 1.プッシュ 2.ポップ 0.終了:";
cin >> menu;
char x;
switch (menu) {
case 1:
try {
cout << " データ:";
cin >> x;
s.push(x);
}
catch (Stack<int>::Overflow&) {
cout << " Overflow!\n";
}
break;
case 2:
try {
cout << " " << s.pop() << '\n';
}
catch (Stack<int>::Empty&) {
cout << " Empty!\n";
}
break;
default: goto L;
}
}
L:;
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7276579
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック