迭代器合并一下吧,毕竟目前来看stack实现方式就两种,链表或者动态数组

This commit is contained in:
建峰 2025-04-24 13:54:05 +08:00
parent 4fa56e1ed8
commit 8f5540743f
2 changed files with 31 additions and 22 deletions

View File

@ -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);

View File

@ -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;