順番が前後してますが FIFO データ構造も作ってみました。
LIFO のものをベースに手直しです。
main.c
/*--------------------------------------------------------------------------------- Queue template library test version 0.01 test Jun 21, 2010 By REGEKATSU ---------------------------------------------------------------------------------*/ #include <stdio.h> #include <nds.h> #include "libmy/Queue.h" void drawQueue(void); //--------------------------------------------------------------------------------- int main(void){ //--------------------------------------------------------------------------------- int value = 0; consoleDemoInit(); printf("Queue template library test\n\nversion 0.01 test\nJun 21, 2010\n\nBy REGEKATSU\n\n\n"); printf("\x01b[22;0HQueue Act :null"); Queue_Init(); while(1) { swiWaitForVBlank(); scanKeys(); drawQueue(); //push if(keysDown() & KEY_A){ if(Queue_Size() != QUEUE_SIZE){ Queue_Push(++value); printf("\x01b[22;12HPush"); } //pop }else if(keysDown() & KEY_B){ if(Queue_Empty() == false){ Queue_Pop(); printf("\x01b[22;12HPop "); } } } } //--------------------------------------------------------------------------------- void drawQueue(void){ //--------------------------------------------------------------------------------- printf("\x01b[8;0HQueue:Value\n"); int i; for(i = 0;i < QUEUE_SIZE;i++){ printf( "\x01b[%d;0H\x01b[2K\r %02d:%d\n", 9 + i, QUEUE_SIZE - (i + 1), *Queue_Request(QUEUE_SIZE - (i + 1)) ); } printf("\n"); printf("Queue Empty:%s\n", (Queue_Empty() == true) ? "true ":"false"); printf("Queue Size :%02d\n", Queue_Size()); } //---------------------------------------------------------------------------------
Queue.h
/*--------------------------------------------------------------------------------- Queue template library header version 0.01 test Jun 21, 2010 By REGEKATSU ---------------------------------------------------------------------------------*/ #ifndef _QUEUE_H_ #define _QUEUE_H_ #include <nds/ndstypes.h>//bool #define QUEUE_SIZE (10) #ifdef __cplusplus extern "C" { #endif //キューデータ構造を初期化します。 void Queue_Init(void); //現在のキューの最後の要素への参照を返します。 int *Queue_Back(void); //現在のキューが空ならtrueを返します。空でない場合にはfalseを返します。 bool Queue_Empty(void); //現在のキューの先頭の要素への参照を返します。 int *Queue_Front(void); //現在のキューの先頭の要素を破棄します。 void Queue_Pop(void); //現在のキューに値を追加します。 void Queue_Push(int value); //現在のキューの任意の要素への参照を返します。 int *Queue_Request(int number); //現在のキューの要素数を返します。 int Queue_Size(void); #ifdef __cplusplus } #endif #endif //_QUEUE_H_
Queue.c
/*--------------------------------------------------------------------------------- Queue template library routine version 0.01 test Jun 21, 2010 By REGEKATSU ---------------------------------------------------------------------------------*/ #include <string.h> #include "Queue.h" typedef struct _Queue{ int value[QUEUE_SIZE]; int front; int back; int size; }_Queue; static _Queue st_queue; #define SET_INDEX(idx) (((idx) >= QUEUE_SIZE) ? idx - QUEUE_SIZE:idx) #define NEXT_INDEX(idx) (((idx) + 1) % QUEUE_SIZE) //--------------------------------------------------------------------------------- void Queue_Init(void){ //--------------------------------------------------------------------------------- //キューデータ構造を初期化します。 memset(&st_queue, 0, sizeof(st_queue)); } //--------------------------------------------------------------------------------- int *Queue_Back(void){ //--------------------------------------------------------------------------------- //現在のキューの最後の要素への参照を返します。 if(st_queue.size == 0) return NULL; return &st_queue.value[st_queue.back]; } //--------------------------------------------------------------------------------- bool Queue_Empty(void){ //--------------------------------------------------------------------------------- //現在のキューが空ならtrueを返します。空でない場合にはfalseを返します。 return (st_queue.size == 0) ? true:false; } //--------------------------------------------------------------------------------- int *Queue_Front(void){ //--------------------------------------------------------------------------------- //現在のキューの先頭の要素への参照を返します。 if(st_queue.size == 0) return NULL; return &st_queue.value[st_queue.front]; } //--------------------------------------------------------------------------------- void Queue_Pop(void){ //--------------------------------------------------------------------------------- //現在のキューの先頭の要素を破棄します。 if(st_queue.size > 0){ st_queue.value[st_queue.front] = 0; st_queue.front = NEXT_INDEX(st_queue.front); st_queue.size--; } } //--------------------------------------------------------------------------------- void Queue_Push(int value){ //--------------------------------------------------------------------------------- //現在のキューに値を追加します。 if(st_queue.size < QUEUE_SIZE){ st_queue.value[st_queue.back] = value; st_queue.back = NEXT_INDEX(st_queue.back); st_queue.size++; } } //--------------------------------------------------------------------------------- int *Queue_Request(int number){ //--------------------------------------------------------------------------------- //現在のキューの任意の要素への参照を返します。 if(number < 0 || number >= QUEUE_SIZE) return NULL; if(st_queue.size == 0) return NULL; return &st_queue.value[SET_INDEX(st_queue.front + number)]; } //--------------------------------------------------------------------------------- int Queue_Size(void){ //--------------------------------------------------------------------------------- //現在のキューの要素数を返します。 return st_queue.size; } //---------------------------------------------------------------------------------