在C++中,能夠直接使用std::stack數組
C語言實現以下:spa
1 stack.c 2 3 /** 4 * @file stack.c 5 * @brief 棧,順序存儲. 6 * 7 * 8 * 9 */ 10 11 #include <stdlib.h> /* for malloc() */ 12 #include <string.h> /* for memcpy() */ 13 14 typedef int stack_elem_t; // 元素的類型 15 16 /** 17 * @struct 18 * @brief 棧的結構體 19 */ 20 typedef struct stack_t { 21 int size; /** 實際元素個數 */ 22 int capacity; /** 容量,以元素爲單位 */ 23 stack_elem_t *elems; /** 棧的數組 */ 24 }stack_t; 25 26 /** 27 * @brief 初始化棧. 28 * @param[inout] s 棧對象的指針 29 * @param[in] capacity 初始容量 30 * @return 無 31 */ 32 void stack_init(stack_t *s, const int capacity) { 33 s->size = 0; 34 s->capacity = capacity; 35 s->elems = (stack_elem_t*)malloc(capacity * sizeof(stack_elem_t)); 36 } 37 38 /** 39 * @brief 釋放棧. 40 * @param[inout] s 棧對象的指針 41 * @return 無 42 */ 43 void stack_uninit(stack_t *s) { 44 s->size = 0; 45 s->capacity = 0; 46 free(s->elems); 47 s->elems = NULL; 48 } 49 50 /** 51 * @brief 判斷棧是否爲空. 52 * @param[in] s 棧對象的指針 53 * @return 是空,返回 1,不然返回 0 54 */ 55 int stack_empty(const stack_t *s) { 56 return s->size == 0; 57 } 58 59 /** 60 * @brief 獲取元素個數. 61 * @param[in] s 棧對象的指針 62 * @return 元素個數 63 */ 64 int stack_size(const stack_t *s) { 65 return s->size; 66 } 67 68 /** 69 * @brief 進棧. 70 * @param[in] s 棧對象的指針 71 * @param[in] x 要進棧的元素 72 * @return 無 73 */ 74 void stack_push(stack_t *s, const stack_elem_t x) 75 { 76 if(s->size == s->capacity) 77 { 78 /* 已滿,從新分配內存 */ 79 stack_elem_t* tmp = (stack_elem_t*)realloc(s->elems, 80 s->capacity * 2 * sizeof(stack_elem_t)); 81 s->capacity *= 2; 82 s->elems = tmp; 83 } 84 s->elems[s->size++] = x; 85 } 86 87 /** 88 * @brief 進棧. 89 * @param[in] s 棧對象的指針 90 * @return 無 91 */ 92 void stack_pop(stack_t *s) { 93 s->size--; 94 } 95 96 /** 97 * @brief 獲取棧頂元素. 98 * @param[in] s 棧對象的指針 99 * @return 棧頂元素 100 */ 101 stack_elem_t stack_top(const stack_t *s) { 102 return s->elems[s->size - 1]; 103 } 104
注意到在push進棧的過程當中,若是此時分配的棧空間已經滿了,realloc內存空間爲當前棧空間的兩倍。指針
realloc(指向該內存的指針,從新分配內存大小);使用realloc時應格外當心,由於當從新分配內存大小小於原來內存大小的時候,可能致使數據的丟失。code