キュー

http://www.geocities.jp/ky_webid/algorithm/009.html

スタックとは違い、データの追加は後ろですが、データの取り出しは先頭からになります。

#include <stdio.h>

typedef struct {
    int data[100];
    int end;
    int start;
} queue;

void enqueue (queue *q,int data) {
    if ( q->end >= 100 ) {
        q->end = 0;
    }
    q->data[q->end++] = data;
}

int dequeue (queue *q) {
    if ( q->start >= 100 ) {
        q->start = 0;
    }
    return q->data[q->start++];
}

int main (void) {
    queue q;
    q.start = 0;
    q.end = 0;
    
    enqueue(&q,100);
    enqueue(&q,200);
    
    printf("%d\n", dequeue(&q) );
    
    enqueue(&q,300);
    
    printf("%d\n", dequeue(&q) );
    printf("%d\n", dequeue(&q) );
    
    return 0;
}

スタックと同じような要領でできました。

取り出すときに位置startと、追加するときの位置endを用意して制御しています。

ただ・・・・。このキュー処理はバグりまくりです。

まずenqueue。startの位置を超えてしまうとデータが上書きされてしまいます。

んでdequeue。これは逆にendの位置を超えてしまっていてもデータを取得してしまいます。

つまりエラーの制限がかかってないのです。

そしてそれをやろうと思ったとき、かなり難しいことに気付きました。というか、多分やり方としては難しくないんだろうけど色々試したんですが、思いつかなかったのですorz

キューは難しいですね。もういっそ配列の要素を移動させた方が簡単なんじゃないかと思ったくらいです。

解答例との比較

何度も読んで良く分かりました。何故僕が難しく感じたのか。

やはり次の値がポイントですね。100までいったら0に戻る処理を先にやってしまっていたのでそれがダメだったみたいです。

先に確定してしまうと計算が凄くやりずらい。だからできなかった。解答例を見てみると、nextというマクロ関数を用意し、都度計算して次の値を求めています。ここが大きな違いでしたね。

精進せねば。