mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-17 11:31:37 +08:00
迭代器合并一下吧,毕竟目前来看stack实现方式就两种,链表或者动态数组
This commit is contained in:
parent
4fa56e1ed8
commit
8f5540743f
@ -21,7 +21,12 @@ struct _stack_node
|
|||||||
|
|
||||||
struct _stack
|
struct _stack
|
||||||
{
|
{
|
||||||
// ---------- private ----------
|
// -------------------- private --------------------
|
||||||
|
/**
|
||||||
|
* @brief head pointer of stack
|
||||||
|
* 1. linklist: head->next is valid, head->obj is NULL
|
||||||
|
* 2. array: head->obj is valid, head->next is NULL,
|
||||||
|
*/
|
||||||
struct _stack_node * _head;
|
struct _stack_node * _head;
|
||||||
|
|
||||||
uint32_t _size;
|
uint32_t _size;
|
||||||
@ -33,7 +38,7 @@ struct _stack
|
|||||||
|
|
||||||
void (*_destory)(struct _stack* self);
|
void (*_destory)(struct _stack* self);
|
||||||
|
|
||||||
// ---------- public ----------
|
// -------------------- public --------------------
|
||||||
// kernel
|
// kernel
|
||||||
bool (*push)(struct _stack* self, void* obj);
|
bool (*push)(struct _stack* self, void* obj);
|
||||||
bool (*pop)(struct _stack* self, void* obj);
|
bool (*pop)(struct _stack* self, void* obj);
|
||||||
|
44
src/stack.c
44
src/stack.c
@ -254,20 +254,14 @@ static void stack2_print(struct _stack* self)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const void* stack2_iter_next(struct _iterator* iter)
|
/**
|
||||||
{
|
* @brief iterator next
|
||||||
assert(iter != NULL);
|
* from top to bottom
|
||||||
assert(iter->parent != NULL);
|
*
|
||||||
|
* @param iter
|
||||||
stack_t self = (stack_t)iter->_parent;
|
* @return const void*
|
||||||
// from top to bottom
|
* the value of return is const, so you can't modify it.
|
||||||
uint32_t index = self->size(self) - 1 - self->_iter._cur;
|
*/
|
||||||
|
|
||||||
void *obj = self->_head->obj + self->_obj_size * index;
|
|
||||||
self->_iter._cur += 1;
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
const void* stack_iter_next(struct _iterator* iter)
|
const void* stack_iter_next(struct _iterator* iter)
|
||||||
{
|
{
|
||||||
assert(iter != NULL);
|
assert(iter != NULL);
|
||||||
@ -276,13 +270,23 @@ const void* stack_iter_next(struct _iterator* iter)
|
|||||||
stack_t self = (stack_t)iter->_parent;
|
stack_t self = (stack_t)iter->_parent;
|
||||||
void *obj = NULL;
|
void *obj = NULL;
|
||||||
|
|
||||||
// from top to bottom
|
if(self->_head->obj == NULL)
|
||||||
struct _stack_node* node = (struct _stack_node *)self->_iter._cur_node;
|
|
||||||
if(node != NULL)
|
|
||||||
{
|
{
|
||||||
obj = node->obj;
|
// base on linklist
|
||||||
self->_iter._cur_node = node->next;
|
struct _stack_node* node = (struct _stack_node *)self->_iter._cur_node;
|
||||||
|
if(node != NULL)
|
||||||
|
{
|
||||||
|
obj = node->obj;
|
||||||
|
self->_iter._cur_node = node->next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// base on array
|
||||||
|
uint32_t index = self->size(self) - 1 - self->_iter._cur;
|
||||||
|
obj = self->_head->obj + self->_obj_size * index;
|
||||||
|
}
|
||||||
|
|
||||||
self->_iter._cur += 1;
|
self->_iter._cur += 1;
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
@ -386,7 +390,7 @@ static bool stack_init2(struct _stack* self, uint32_t obj_size, uint32_t capacit
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
self->_iter.next = stack2_iter_next;
|
self->_iter.next = stack_iter_next;
|
||||||
self->_iter.hasnext = stack_iter_hasnext;
|
self->_iter.hasnext = stack_iter_hasnext;
|
||||||
|
|
||||||
self->_destory = stack2_destory;
|
self->_destory = stack2_destory;
|
||||||
|
Loading…
Reference in New Issue
Block a user