ページ 11

キュークラスのデータ取り出しについて

Posted: 2013年11月30日(土) 17:58
by ドイ
いつもお世話になっております。
ドイです。
前回スタッククラスについて質問させていただきました。
今回はキュークラスについての質問なのですが、
データ格納→取り出しプログラムをキュークラスを使って作っています。
このプログラムのデータ取り出しのとき
同じ値を2度取り出してしまいます。
おそらくデータ取り出しの部分に不備があると思うのですが、
直す部分がわからないので質問させていただきます。よろしくお願いします。

コード:

#include <iostream.h>

const int qs = 5;
//キュークラスの定義
class Queue{
	private :
	int ryouiki[qs];
	int TAIL; //次に格納できるデータの場所
	int HEAD; //次に取り出せるデータの場所
	
	public :

//コンストラクタ
Queue()
{
	TAIL = 0;
	HEAD = 0;
	
};

//データの格納

void enqueue(int data){
	if(TAIL < qs){
		ryouiki[TAIL] = data;
		TAIL+1;
	}
	if(TAIL >= qs){
		cout <<"Overflow";
		exit(1);
	}
}


	
	//データを取り出す
	int dequeue()
	{
		if(0 <= HEAD){
			HEAD-1;
			return ryouiki[HEAD];
		}else{
			cout <<"Underflow fail";
			exit(1);
		}
		return 0;
	}
};
	
	main(){
	Queue qu;
	int data;
	
	cout << "data = " ;
	cin >> data ;
	qu.enqueue(data) ;
	
	cout << "data = " ;
	cin >> data ;
	qu.enqueue(data);
	
	cout << "―― データの取り出し ――" << endl;
	data = qu.dequeue() ;
	cout << data << endl;
	data = qu.dequeue() ;
	cout << data << endl;
	
	return 0 ;
}
	
	
上のプログラムの36~48行目です。
自分はそこを直せば(直し方がわからないのですが…)正しく動くと考えているのですが、
他にもおかしいところがあったりした場合はご教鞭のほど、よろしくお願いします。

Re: キュークラスのデータ取り出しについて

Posted: 2013年11月30日(土) 23:46
by Poco
26行目と40行目、変数の更新できていませんよ。
なのでデータを2つ入れたつもりになっても、実際2回目の追加は1回目に追加したデータの上書をやっているだけです。
きちんとデバッガ使ってステップ実行しながら変数が保持している値を見ましょう。

Re: キュークラスのデータ取り出しについて

Posted: 2013年12月01日(日) 15:42
by みけCAT
dequeueのチェックが0 <= HEADだけでは甘いと思います。

Re: キュークラスのデータ取り出しについて

Posted: 2013年12月01日(日) 17:49
by RS
いろいろ指摘してみます。

・26, 40行目
 POCO様の指摘通り、値が更新できていません。
 TAIL += 1; TAIL = TAIL+1; TAIL++; ++TAIL;
 代入形式かインクリメント・デクリメントを使いましょう。

・28行目
 24行目ifと真逆の条件なのでelseを使いましょう。

・40行目
 HEADを-1していますが、キューの仕様としてはTAILと同じ方向に更新すべきです。+1にしましょう。

・39行目
 HEADをプラス方向の更新に変えたので条件式も変更しましょう。
 if ( HEAD < qs )

・40~41行目
 9行目ではHEADを「次に取り出せるデータの場所」と説明していますが
 実際の処理ではdequeue呼び出し時のHEADが指す値と別の値を返しています。

・46行目
 この行は実行されないので不要です。

・キューの実装について
 上記の指摘を直せば50行目からのmain関数は正常に動作するはずです。
 が、main関数を書きかえてenqueue3回、dequeue3回、再度enqueue3回を実行するとオーバーフローのエラーが発生します。
 具体的にはHEAD・TAILの更新方法とオーバーフロー・アンダーフローの条件式に問題があるので、「リングバッファ」をキーワードに修正方法を考えてみてください。

Re: キュークラスのデータ取り出しについて

Posted: 2013年12月02日(月) 14:21
by ドイ
本当に有難うございます助かりました…
自分のコード作成力に絶望するばかりです
一応プログラムは動作したのですが
RS様のおっしゃっていることを試したら確かにオーバーフローが起こりました。
リングバッファについて調べ、改良してから完成させようと思います。
ありがとうございました。