数据结构——数组实现栈(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 5int 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
