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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ドイ

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

#1

投稿記事 by ドイ » 11年前

いつもお世話になっております。
ドイです。
前回スタッククラスについて質問させていただきました。
今回はキュークラスについての質問なのですが、
データ格納→取り出しプログラムをキュークラスを使って作っています。
このプログラムのデータ取り出しのとき
同じ値を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行目です。
自分はそこを直せば(直し方がわからないのですが…)正しく動くと考えているのですが、
他にもおかしいところがあったりした場合はご教鞭のほど、よろしくお願いします。

Poco
記事: 161
登録日時: 14年前

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

#2

投稿記事 by Poco » 11年前

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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#3

投稿記事 by みけCAT » 11年前

dequeueのチェックが0 <= HEADだけでは甘いと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

RS

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

#4

投稿記事 by RS » 11年前

いろいろ指摘してみます。

・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: キュークラスのデータ取り出しについて

#5

投稿記事 by ドイ » 11年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る