棧的C語言實現

在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

相關文章
相關標籤/搜索