feat(stack): introduce a stack ds, internally this uses a sll
This commit is contained in:
parent
69dc1dcb45
commit
945343daa0
4 changed files with 127 additions and 0 deletions
53
ds.c
53
ds.c
|
|
@ -367,3 +367,56 @@ void
|
|||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ds_stack_t
|
||||
*ds_stack_init(void)
|
||||
{
|
||||
ds_stack_t *stack = malloc(sizeof(ds_stack_t));
|
||||
stack->n = 0;
|
||||
|
||||
return stack;
|
||||
}
|
||||
|
||||
int
|
||||
ds_stack_push(ds_stack_t *stack, void *data)
|
||||
{
|
||||
if (stack->n == 0) {
|
||||
stack->items = ds_sll_new_node(data);
|
||||
stack->n++;
|
||||
return 0;
|
||||
}
|
||||
int r = ds_sll_add(&stack->items, data, 0);
|
||||
if (!r) {
|
||||
stack->n++;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
void
|
||||
*ds_stack_pop(ds_stack_t *stack)
|
||||
{
|
||||
void *r = ds_sll_remove(&stack->items, 0);
|
||||
if (r != NULL) {
|
||||
stack->n--;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
void
|
||||
*ds_stack_peek(ds_stack_t *stack, unsigned x)
|
||||
{
|
||||
int i;
|
||||
ds_sll_t *cur;
|
||||
|
||||
if (x > stack->n) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (cur = stack->items, i = 0; cur; cur = cur->next, i++) {
|
||||
if (i == x) {
|
||||
return cur->data;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue