スタック(stack)とキュー(queue)

スタック(stack)

 配列を用いたスタックの実現

/* スタックデータ */
	int data[DATANUM] = { 123, 106, 777, 580, 216 };
/* データの個数 */
	int datanum = 5;
/*
	datanum-1 がスタックトップのインデックスを表す
	int	*sp = data;
	としてスタックポインタ sp を使っても良い
*/

 プッシュ(Push)

 ポップ(Pop)

 ★スタック操作プログラム(DOSプログラム)ソースの素

キュー(queue)

 配列を用いたキューの実現

 配列を用いたキューの実現(その2)

/* キューデータ */
	int	data[DATANUM] = { 123, 106, 777, 580, 216 };
/* 先頭のインデックス */
	int	head = 0;
/* 末尾のインデックス */
	int	tail = 4;
/*
	(tail + 1) % DATANUM == head の時、キューが空であるとする
*/

補足

  • 配列のN個のデータがリングになっているので,enqueue/dequeueに伴って,
    インデックス(tail/head)は0,1,2,...,N-1,0,1,2,...,N-1,0,1,2,...と進む
    これはNで割った余りの世界(mod N)である!
    剰余類剰余系について調べてみよ!!
    (ここでは配列の要素数DATANUMをNと表している)
  • headやtailが1増える計算はどのような式で書くべきか考えてみよ!
    head++head+=1head=head+1
    等では足りないよね?!
  • データが1個のとき
    head == tail
    である
  • データが0個のとき:最後の1個だったデータがdequeueされてheadが1つ進んだ状態
    ここで1個のデータがenqueueされると,tailが1増えて,1個の状態に戻るから,
    (tail + 1) % DATANUM == head
  • 上の状況はheadからtailまでにN個のデータが全て詰まっている状態と区別できないので,
    別の変数を使って区別する手もあるが,N-1個までしかデータをenqueueしない仕様とする!
  • データが満杯(N-1個)のとき:
    どのような式で判定できるか考えてみよ!

 Enqueue

 Dequeue

  ★キュー操作プログラム(DOSプログラム)ソースの素

プライオリティキュー(priority queue)

 順序配列を用いたプライオリティキューの実現

/* プライオリティキューデータ */
	int data[DATANUM] = { 106, 123, 136, 197, 216 };
/* データの個数 */
	int datanum = 5;
/*
	datanum-1 がキューの先頭のインデックスを表す
*/

 Enqueue

 Dequeue

  ★配列版プライオリティキュー操作プログラム(DOSプログラム)ソースの素

 ヒープを用いたプライオリティキューの実現

/* ヒーププライオリティキューデータ */
	int data[DATANUM] = { 216, 197, 136, 123, 106 };
/* データの個数 */
	int datanum = 5;

 Enqueue

 Dequeue

  ★ヒープ版プライオリティキュー操作プログラム(DOSプログラム)ソースの素