2017年9月3日日曜日

CでStack

 たまに欲しくなるスタック(LIFO)のコード。

typedef struct
{
    uint16_t size;
    uint16_t width;
    uint16_t count;
    void *end;
} Stack_t;

void stack_Init(Stack_t *stack, uint16_t size, uint16_t width, void *buff)
{
    stack->size = size;
    stack->width = width;
    stack->count = 0;
    stack->end = buff + size * width;
}

int stack_Push(Stack_t *stack, void *data)
{
    return (stack->count < stack->size ? memcpy(stack->end - ++stack->count * stack->width, data, stack->width), 1 : 0);
}

int stack_Pop(Stack_t *stack, void *data)
{
    return (stack->count ? memcpy(data, stack->end - stack->count-- * stack->width, stack->width), 1 : 0);
}

int stack_Peek(Stack_t *stack, void *data, uint16_t index)
{
    return (stack->count > index ? memcpy(data, stack->end - ++index * stack->width, stack->width), 1 : 0);
}

int stack_PeekTop(Stack_t *stack, void *data, uint16_t index)
{
    return (stack->count > index ? memcpy(data, stack->end - (stack->count - index) * stack->width, stack->width), 1 : 0);
}


Add 2017/09/04
 stack_Peek関数

Add 2017/09/05
 stack_PeekTop関数
 Peek関数はスタックの底から、PeekTopは上からインデックスが始まる。PeekTopで0を指定すると最後に入れたデータが帰る。Peekで0を指定すると最初に入れたデータが帰る。PeekTopはPeekでもStack.Countとか使えば同じ動作になるのでPeekのみ作ってたが、やっぱり一発で上から取り出せるほうが便利なのでPeekTopも追加した次第。

0 件のコメント:

コメントを投稿