下記に示すように、まず、原理を達成するために
環状キューの実装は、以下の4つの点(「3、キューの簡単な実装」本質として)ことに留意すべきである:
(1)キューライトデータ
のmemcpy(&g_tQue [g_iWritePos]、•PNODE、はsizeof(T_QUEUE));
g_iWritePos =(g_iWritePos + 1)%QUEUE_SIZE_MAX 。
(2)キューから読み出さ
のmemcpy(•PNODE、&g_tQue [g_iReadPos]、はsizeof(T_QUEUEを));
g_iReadPos =(+ g_iReadPos 1)%QUEUE_SIZE_MAX;
(3)データキューが満たされる
((g_iWritePos + 1)%QUEUE_SIZE_MAX ) g_iReadPos ==) 、読み出すべき位置に等しい次の書き込み位置、
キューがQUEUE_SIZE_MAXが内部に格納され、キューが一杯になったとき、実際には、充填されている- 1つのデータ、及び空にするためにそうする
の担当するキュー領域を
(4)待ち行列が空(データなし)である
g_iWritePos == g_iReadPos、現在位置が現在の書き込み位置を書き込むに等しく、キューが空である
2つの次のコードを達成するために
1の#include <stdio.hの> 2の#include < ストリング・H> 3の#include <STDLIB.H> 4 5 の#define QUEUE_SIZE_MAX 10 6 の#define MY_BUF_SIZE 128 7 8のtypedef 構造体{ 9 のint タイプ。 10 int型の準備。 11 INT [MY_BUF_SIZE] BUF。 12 } T_QUEUE。 13 14 静的T_QUEUE g_tQue [QUEUE_SIZE_MAX]。 15 16 静的 INT g_iReadPos = 0 。 17 静的 int型 g_iWritePos = 0 ;; 18 19 静的 INT isFull(ボイド) 20 { 21 リターン(((g_iWritePos + 1)%QUEUE_SIZE_MAX)== g_iReadPos)。 22 } 23 24 静的 INTのisEmpty(ボイド) 25 { 26 リターン(g_iWritePos == g_iReadPos)。 27 } 28 29 静的 INT PutData(T_QUEUE * PNODE) 30 { 31 もし(isFull()) 32 { 33 のprintf(" quequeがオーバーフローである\ Rを\ n!" )。 34 リターン - 1 。 35 } 36 他の 37 { 38 のmemcpy(&g_tQue [g_iWritePos]、PNODE、はsizeof (T_QUEUE))。 39 g_iWritePos =(g_iWritePos + 1)%QUEUE_SIZE_MAX。 40 リターン 0 ; 41 } 42 } 43 44 静的 INTのGetData(T_QUEUE *PNODE) 45 { 46 であれば(のisEmpty()) 47 { 48 のprintf(" quequeが空である\ rをする\ n!" )。 49 リターン - 1 。 50 } 51 他の 52 { 53 のmemcpy(PNODE、&g_tQue [g_iReadPos]、はsizeof (T_QUEUE))。 54 g_iReadPos =(g_iReadPos + 1)%QUEUE_SIZE_MAX。 55 } 56 57 }