#include "c_ArrayStack.h" #include #define DEFAULT_INITIAL_CAPACITY 4 c_err_t c_ArrayStack_Init(c_ArrayStack_t* self, int obj_size, c_size_t capacity) { if (!self || obj_size <= 0) return C_ERR_PARAM; self->obj_size = obj_size; self->capacity = (capacity > 0) ? capacity : DEFAULT_INITIAL_CAPACITY; self->size = 0; self->array = C_ALLOC(self->capacity * self->obj_size); if (!self->array) { self->capacity = 0; return C_ERR_NOMEM; } return C_ERR_SUCCESS; } void c_ArrayStack_Destroy(c_ArrayStack_t* self) { if (!self) return; C_FREE(self->array); self->capacity = 0; self->size = 0; self->obj_size = 0; } c_err_t c_ArrayStack_Push(c_ArrayStack_t* self, void* obj) { if (!self || !self->array || !obj) return C_ERR_PARAM; if (self->size >= self->capacity) { const c_size_t new_capacity = self->capacity << 1; void* new_array = C_REALLOC(self->array, new_capacity * self->obj_size); if (!new_array) { return C_ERR_NOMEM; } self->array = new_array; self->capacity = new_capacity; } // 計算頂端目標記憶體地址並寫入資料 char* target = (char*)self->array + (self->size * self->obj_size); memcpy(target, obj, self->obj_size); self->size++; return C_ERR_SUCCESS; } c_err_t c_ArrayStack_Pop(c_ArrayStack_t* self, void* obj) { if (!self || !self->array || !obj) return C_ERR_PARAM; if (self->size == 0) return C_ERR_EMPTY; // 堆疊已空 // 取得位於 size - 1 的堆疊頂端元素地址 const char* pop_src = (char*)self->array + ((self->size - 1) * self->obj_size); // 直接複製到呼叫端提供的記憶體中 memcpy(obj, pop_src, self->obj_size); self->size--; return C_ERR_SUCCESS; } void* c_ArrayStack_Peek(c_ArrayStack_t* self) { if (!self || !self->array || self->size == 0) return NULL; return (char*)self->array + ((self->size - 1) * self->obj_size); } c_err_t c_ArrayStack_Remove(c_ArrayStack_t* self, c_size_t index) { if (!self || !self->array) return C_ERR_PARAM; if (index >= self->size) return C_ERR_INDEX; // 如果刪除的不是頂端元素,則後續元素需向前平移一個單位 if (index < self->size - 1) { char* dest = (char*)self->array + (index * self->obj_size); const char* src = dest + self->obj_size; const c_size_t num_elements_to_move = self->size - index - 1; memmove(dest, src, num_elements_to_move * self->obj_size); } self->size--; return C_ERR_SUCCESS; }