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

広告

posted by fanblog

2018年02月01日

《その269》 問題演習 p.349演習9-10



新版明解C++中級編 p.349 演習9-10
 キューを実現するクラステンプレートを作成せよ。キューは FIFO すなわち先入れ先出し(最初に入れたデータが最初に取り出される)の構造をもつ。



// 解答


// SimpleQueue.h
#ifndef ___Class_SimpleQueue
#define ___Class_SimpleQueue

// キュークラステンプレート
template<class Type> class SimpleQueue {
int size; // キュー容量
int ptr; // 末尾ポインタ
Type* que; // 先頭要素へのポインタ

// コピーコンストラクタの無効化
SimpleQueue(const SimpleQueue<Type>&);

// 代入演算子の無効化
SimpleQueue& operator=(const SimpleQueue<Type>&);

public:
class Overflow { }; // Overflow例外
class Empty { }; // Empty例外

// コンストラクタ
explicit SimpleQueue(int sz);

// デストラクタ
~SimpleQueue();

// enqueue追加
Type& enqueue(const Type& x);

// dequeue()削除取り出し
Type dequeue();

// キューの容量
int capacity();

// キューが満杯
bool is_full();

// キューが空
bool is_empty();
};

#include "SimpleQueueImplementation.h"

#endif




// SimpleQueueImplementation.h
#ifndef ___Class_SimpleQueueImplementation
#define ___Class_SimpleQueueImplementation

// コンストラクタ
template<class Type>
SimpleQueue<Type>::SimpleQueue(int sz)
: size(sz), ptr(0) {
que = new Type[size];
}

// デストラクタ
template<class Type>
SimpleQueue<Type>::~SimpleQueue() {
delete[] que;
}

// enqueue
template<class Type>
Type& SimpleQueue<Type>::enqueue(const Type& x) {
if (ptr >= size)
throw Overflow();
return que[ptr++] = x;
}

// dequeue
template<class Type>
Type SimpleQueue<Type>::dequeue() {
if (ptr <= 0)
throw Empty();

Type temp = que[0];

for (int i = 0; i < ptr; i++)
que[i] = que[i + 1];
--ptr;

return temp;
}

// キューの容量
template<class Type>
int SimpleQueue<Type>::capacity() {
return size;
}

// キューが満杯
template<class Type>
bool SimpleQueue<Type>::is_full() {
return size == ptr;
}

// キューが空
template<class Type>
bool SimpleQueue<Type>::is_empty() {
return ptr == 0;
}

#endif




// SimpleQueueTest.cpp
#include <string>
#include <iostream>
#include "SimpleQueue.h"
using namespace std;

void enqueue_it(SimpleQueue<char>& q, char c) {
try {
q.enqueue(c);
}
catch (const SimpleQueue<char>::Overflow&) {
cout << "\a !満杯の<char>キューに"
"enqueue しようとしました。\n";
}
}

void dequeue_it(SimpleQueue<char>& q) {
try {
char c = q.dequeue();
cout << ' ' << c << '\n';
}
catch (const SimpleQueue<char>::Empty&) {
cout << "\a !空の<char>キューから"
"dequeue しようとしました。\n";
}
}

void dequeue_all(SimpleQueue<char>& q) {
if (q.is_empty()) {
dequeue_it(q); goto L;
}
while (!q.is_empty()) {
cout << ' ' << q.dequeue();
}
cout << '\n';
L:;
}

int main() {
int nn;
cout << "キューの容量 : "; cin >> nn;
SimpleQueue<char> q(nn);
cout << "容量 " << q.capacity()
<< " のキューを準備しました。\n";

while (1) {
int f; char c;
cout << "◆ 1.enqueue 2.dequeue "
"3.文字列をenqueue "
"4.全dataをdequeue 0.終了 : ";
cin >> f;

if (f == 1) {
cout << " 文字 : "; cin >> c;
enqueue_it(q, c);
}
else if (f == 2)
dequeue_it(q);
else if (f == 3) {
string x;
cout << " 文字列:";
cin >> x;

for (unsigned i = 0; i < x.length(); i++)
enqueue_it(q, x[i]);
}
else if (f == 4) {
dequeue_all(q);
}
else break;

if (q.is_full()) cout << " ※満\n";
if (q.is_empty()) cout << " ※空\n";
}
}

f09_10.png




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

お名前:

メールアドレス:


ホームページアドレス:

コメント:

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

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

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

 たまに、クリック お願いします 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日以上新しい記事の更新がないブログに表示されております。