在C++中,可以直接使用std::stack

C语言实现如下:

 stack.c

 /**
* @file stack.c
* @brief 栈,顺序存储.
*
*
*
*/ #include <stdlib.h> /* for malloc() */
#include <string.h> /* for memcpy() */ typedef int stack_elem_t; // 元素的类型 /**
* @struct
* @brief 栈的结构体
*/
typedef struct stack_t {
int size;         /** 实际元素个数 */
int capacity;       /** 容量,以元素为单位 */
stack_elem_t *elems;   /** 栈的数组 */
}stack_t; /**
* @brief 初始化栈.
* @param[inout] s 栈对象的指针
* @param[in] capacity 初始容量
* @return 无
*/
void stack_init(stack_t *s, const int capacity) {
s->size = ;
s->capacity = capacity;
s->elems = (stack_elem_t*)malloc(capacity * sizeof(stack_elem_t));
} /**
* @brief 释放栈.
* @param[inout] s 栈对象的指针
* @return 无
*/
void stack_uninit(stack_t *s) {
s->size = ;
s->capacity = ;
free(s->elems);
s->elems = NULL;
} /**
* @brief 判断栈是否为空.
* @param[in] s 栈对象的指针
* @return 是空,返回 1,否则返回 0
*/
int stack_empty(const stack_t *s) {
return s->size == ;
} /**
* @brief 获取元素个数.
* @param[in] s 栈对象的指针
* @return 元素个数
*/
int stack_size(const stack_t *s) {
return s->size;
} /**
* @brief 进栈.
* @param[in] s 栈对象的指针
* @param[in] x 要进栈的元素
* @return 无
*/
void stack_push(stack_t *s, const stack_elem_t x)
{
if(s->size == s->capacity)
{
/* 已满,重新分配内存 */
stack_elem_t* tmp = (stack_elem_t*)realloc(s->elems,
s->capacity * * sizeof(stack_elem_t));
s->capacity *= ;
s->elems = tmp;
}
s->elems[s->size++] = x;
} /**
* @brief 进栈.
* @param[in] s 栈对象的指针
* @return 无
*/
void stack_pop(stack_t *s) {
  s->size--;
} /**
* @brief 获取栈顶元素.
* @param[in] s 栈对象的指针
* @return 栈顶元素
*/
stack_elem_t stack_top(const stack_t *s) {
  return s->elems[s->size - ];
}

  注意到在push进栈的过程中,如果此时分配的栈空间已经满了,realloc内存空间为当前栈空间的两倍。

  realloc(指向该内存的指针,重新分配内存大小);使用realloc时应格外小心,因为当重新分配内存大小小于原来内存大小的时候,可能导致数据的丢失。

04-20 17:45