- ベストアンサー
エンキューとデキューの操作関数
- エンキューとデキューの操作関数の解説
- キューを実現する構造体について
- キューの操作関数の実装例
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
なんかわざわざrearをずらして読み辛くしてある感じがします。このコード。 どう使うのかは呼び出し側のコードとセットで初めて分かるので一応「断定」はできませんが 今見たらかなり似てるやつが C言語によるアルゴリズムとデータ構造(柴田望洋+辻亮介著) に載ってました。 初期化の段階で num front rear が0になってて queが確保領域へのポインタ maxに確保領域の要素数 が入ってるとして その物のコードや詳しい解説は買ってみてのお楽しみ(?)ということでw 一応少しだけ変形して引用すると int QueueEnque( Queue *q, int x ){ if( q->num == q->max ) return -1; q->num++; q->que[q->rear++] = x; if ( q->rear == q->max ) q->rear = 0; return 0; } int QueueDeque( Queue *q, int *x ){ if ( !q->num ) return -1; q->num--; *x = q->que[q->front++]; if( q->front == q->max ) q->front = 0; return 0; } こういうコードの方が遥かに素直だと思います。 なお q->que[q->rear++] = x; if ( q->rear == q->max ) q->rear = 0; ↓ q->que[q->rear] = x; q->rear = (q->rear+1) % q->max; とも書けますね。 循環がキーワードですが これらのコードでは意味は分かりますか?
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
そ~なんですよ, エンキューで rear をいじる必要などないんですよ~>#2. このコードではデキューの方でデータを取り出す前にインクリメントしてるものだから, そこにあわせてエンキューで rear を調整しなきゃならないなっちゃってる. これは本来デキューの方を修正すべきところです. ぶっちゃけいえば「コードが悪い」ってこと. ああ, #1 のお礼に「あれが何を行っているのかがわからなくて…」と書かれてますが, 「あれ」が何かわからないので反応できません.
お礼
回答ありがとうございました!
- Tacosan
- ベストアンサー率23% (3656/15482)
このプログラムはさておいて, 「抽象的なデータ構造」としてのキューやエンキュー・デキューという操作は理解できていますか? q->max との比較は成り立たないのが普通だから, そこはとりあえず無視して考えてみ.
お礼
それは、一応わかっているつもりです。 1行ずつ解釈していこうと思って、講義資料など見ていたのですが、 あれが何を行っているのかがわからなくて…
お礼
わかりました!ありがとうございました!