アフィリエイト広告を利用しています

広告

posted by fanblog

2018年02月06日

《その277》 抽象クラステンプレート利用のキュー(線形リストで実現)


 前回《276》に引き、抽象クラステンプレート Queue<> を利用する形式のキューを作成しますが、
今回は配列ではなく、線形リストでキューを実現するプログラムです。
このプログラムも、このあとの演習問題で必要になるので、一応ここで作成しておきます。

 以下がプログラムです。

#include <iostream>
using namespace std;

// 抽象クラステンプレート Queue<>
template <class Type> class Queue {
public:
class Overflow { }; // Overflow例外
class Empty { }; // Empty例外

// 純粋仮想デストラクタ
virtual ~Queue() = 0;

// 純粋仮想関数 push
virtual void enqueue(const Type&) = 0;

// 純粋仮想関数 pop
virtual Type dequeue() = 0;
};

template <class Type>
Queue<Type>::~Queue() { }

// ------------------------

// 線形リスト仕様キュー ListQueue<>

template <class Type> class ListQueue
: public Queue<Type> {

// ノード Node<Type>
template <class Type> class Node {
friend class ListQueue<Type> ; // 「 ; 」追加 ←訂正しました(2/7 00:30)
Type* data;
Node* next;
public:
Node(Type* d, Node* n)
: data(d), next(n) { }
};

Node<Type>* top;
Node<Type>* last;

public:
// コンストラクタ
ListQueue() {
top = NULL;
}

// デストラクタ
~ListQueue() {
while (top != NULL) {
if (top->next != NULL) {
Node<Type>* temp = top->next;
delete top->data;
delete top;
top = temp;
}
else {
delete top->data;
delete top;
top = NULL;
}
}
}

// enqueue
void enqueue(const Type& x) {
if (top == NULL)
top = last = new Node<Type>(new Type(x), NULL);
else {
Node<Type>* temp = last;
try {
last = new Node<Type>(new Type(x), NULL);
}
catch (const std::bad_alloc&) {
throw Queue<Type>::Overflow();
}
temp->next = last;
}
}

// dequeue
Type dequeue() {
if (top == NULL) {
throw Queue<Type>::Empty();
}
else if (top->next == NULL) {
Type temp = *(top->data);
delete top->data;
delete top;
top = NULL;
return temp;
}
else {
Node<Type>* temp = top->next;
Type tmp = *(top->data);
delete top->data;
delete top;
top = temp;
return tmp;
}
}
};

// ------------------------

// クラステンプレートの利用プログラム

void enqueue_it(ListQueue<int>& q, int x) {
try {
q.enqueue(x);
}
catch (const bad_alloc&) {
cout << " bad_alloc!!\n";
}
}

void dequeue_it(ListQueue<int>& x) {
try {
int n = x.dequeue();
cout << ' ' << n << '\n';
}
catch (const Queue<int>::Empty&) {
cout << " 空!!\n";
}
}

int main() {
ListQueue<int>* q = new ListQueue<int>();

while (1) {
int f; int n;
cout << "◆ 1.enqueue 2.dequeue "
"0.終了 : ";
cin >> f;

if (f == 1) {
try {
cout << " 整数 : "; cin >> n;
q->enqueue(n);
}
catch (const bad_alloc&) {
cout << " bad_alloc!!\n";
}
}
else if (f == 2){
try {
cout << " " << q->dequeue() << '\n';
}
catch (const Queue<int>::Empty&) {
cout << " 空!!\n";
}
}
else {
delete q; break;
}
}
}

f09_0088.png

f09_0089.png



この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7282671
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。