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