vlambda博客
学习文章列表

数据结构——数组实现栈(C语言)

栈——线性表变异体

栈是一种插入和删除都在同一端的线性表。这个同一端叫栈顶。栈的插入和删除都在同一端,所以最后插入的数据肯定会最先会被取出,这种逻辑结构叫先进后出——LIFO(Last in first out)。插入操作叫入栈,删除操作叫出栈实现栈可以使用数组或链表来实现

使用数组实现代码

  • 判断是否为空
static int is_stack_empty(stack_t *s){ return (s->top == STACK_IS_EMPTY);}

STACK_IS_EMPTY值是-1

  • 判断是否满
static int is_stack_full(stack_t *s){ return (s->top >= (s->size - 1));}
  • 栈初始化
/************************************************************************ * @brief:  * @param[in]: None * @retval[out]: None * @note:  * @author: guangjieMVP**************************************************************************/int stack_init( stack_t *s, int *stack_buffer, int size ){ if(!s || !stack_buffer) return -1;
s->stack_buf = stack_buffer; s->size = size; s->top = -1; return 0;}
  • 栈解初始化
int stack_deinit( stack_t *s){ if(!s) return -1;
memset(s->stack_buf, 0, s->size); s->size = 0; s->top = 0; return 0;}
  • 入栈
/************************************************************************ * @brief: 入栈 * @param[in]: None * @retval[out]: None * @note:  * @author: guangjieMVP**************************************************************************/int stack_push(stack_t *s,int data){ if(!s) return -1;
if(is_stack_full(s)) return -1;
s->top++; s->stack_buf[s->top] = data; return 0;}
  • 出栈
/************************************************************************ * @brief: 出栈or弹栈 * @param[in]: None * @retval[out]: None * @note:  * @author: guangjieMVP**************************************************************************/int stack_pop(stack_t *s, int *data){ if(!s || !data) return -1;  if(is_stack_empty(s)) return -1;  *data = s->stack_buf[s->top]; s->top--; return 0;}

测试

  • 测试代码
#include "stdio.h"#include "stack.h"
#define STACK_SIZE 5
int stack_buffer[STACK_SIZE];
stack_t stack;
int main(int argc, char **argv){ int data; int i;
stack_init(&stack, stack_buffer, STACK_SIZE);
for(i = 0; i < (STACK_SIZE+1); i++) { if(stack_push(&stack, i) == -1) { printf("stack is full\r\n"); } else { printf("enter = %d\r\n", i); } } printf("\r\n"); for(i = 0; i < (STACK_SIZE+1); i++) { if(stack_pop(&stack, &data) == -1) { printf("stack is empty\r\n"); } else { printf("out = %d\r\n",data); } }
return 0;}
  • 测试结果 验证Last in first out