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";
}
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7264678
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック