栈的定义(摘自百度百科):
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
下面用C语言实现栈的顺序存储,直接上代码。
在includes.h文件里,包含了程序需要运行的所有头文件
#ifndef __INCLUDES_H__
#define __INCLUDES_H__
#ifdef __cpluscplus
extern "C" {
#endif
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "sequen_stack.h"
#include "test.h"
#ifdef __cplusplus
}
#endif
#endif
sequen_statck.h:一些宏定义和栈的接口函数的声明
#ifndef __SEQUEN_STACK_H__
#define __SEQUEN_STACK_H__
#ifdef __cpluscplus
extern "C" {
#endif
#define STACK_SIZE_MAX 1024
#define EMPTY_STACK_FLAG 0
#define STACK_DATA_ERROR -1
#define STACK_IS_EMPTY 1
#define STACK_NOT_EMPTY 0
//栈的结构体
struct SStack
{
void *data[STACK_SIZE_MAX];
//栈的元素个数
int m_size;
};
typedef void *sequen_stack;
//初始化栈
sequen_stack init_sequen_stack(void);
//入栈
void push_sequen_stack(sequen_stack stack,void *data);
//出栈
void pop_sequen_stack(sequen_stack stack);
//获取栈顶元素
void * top_sequen_stack(sequen_stack stack);
//栈的大小
int size_sequen_stack(sequen_stack stack);
//判断栈是否为空
int is_empty_sequen_stack(sequen_stack stack);
//销毁栈
void destroy_sequen_stack(sequen_stack stack);
#ifdef __cplusplus
}
#endif
#endif
sequen_statck.c:栈的接口函数的实现
#include "includes.h"
//初始化栈
sequen_stack init_sequen_stack(void)
{
struct SStack *stack = malloc(sizeof(struct SStack));
if(NULL == stack)
{
return NULL;
}
//清空数组中的每个元素
memset(stack->data,0,sizeof(void *) * STACK_SIZE_MAX);
//初始化栈的大小
stack->m_size = 0;
return stack;
}
//入栈
void push_sequen_stack(sequen_stack stack,void *data)
{
if(NULL == stack)
{
return ;
}
if(NULL == data)
{
return ;
}
//判断是否栈满,如果满了就不能再入栈
struct SStack *my_stack = stack;
if(STACK_SIZE_MAX == my_stack->m_size)
{
return ;
}
//入栈 进行尾插
my_stack->data[my_stack->m_size] = data;
//更新栈的大小
my_stack->m_size++;
}
//出栈
void pop_sequen_stack(sequen_stack stack)
{
if(NULL == stack)
{
return ;
}
//如果是空栈,不执行出栈
struct SStack *my_stack = stack;
if(my_stack->m_size <= 0)
{
return ;
}
//执行出栈
my_stack->data[my_stack->m_size -1] = NULL;
//更新栈的大小
my_stack->m_size--;
}
//获取栈顶元素
void * top_sequen_stack(sequen_stack stack)
{
if(NULL == stack)
{
return ;
}
struct SStack *my_stack = stack;
//如果是空栈 返回NULL
if(EMPTY_STACK_FLAG == my_stack->m_size)
{
return NULL;
}
return my_stack->data[my_stack->m_size - 1];
}
//栈的大小
int size_sequen_stack(sequen_stack stack)
{
if(NULL == stack)
{
return STACK_DATA_ERROR;
}
struct SStack *my_stack = stack;
return my_stack->m_size;
}
//判断栈是否为空
int is_empty_sequen_stack(sequen_stack stack)
{
if(NULL == stack)
{
return STACK_DATA_ERROR; //真
}
struct SStack *my_stack = stack;
if(my_stack->m_size <= 0)
{
return STACK_IS_EMPTY; //真
}
return STACK_NOT_EMPTY; //返回假,代表不是空栈
}
//销毁栈
void destroy_sequen_stack(sequen_stack stack)
{
if(NULL == stack)
{
return;
}
free(stack);
stack = NULL;
}
test.h:测试函数声明
#ifndef __TESE_H__
#define __TESE_H__
#ifdef __cpluscplus
extern "C" {
#endif
//测试结构体
struct Person
{
char name[64];
int age;
};
//栈的接口函数测试
void function_test(void);
#ifdef __cplusplus
}
#endif
#endif
test.c:测试函数实现
#include "includes.h"
void function_test(void)
{
int stack_size;
//准备出6个person数据
struct Person p1 ={"AAA",18};
struct Person p2 ={"BBB",20};
struct Person p3 ={"CCC",30};
struct Person p4 ={"DDD",28};
struct Person p5 ={"EEE",43};
struct Person p6 ={"FFF",19};
//初始化栈
sequen_stack stack = init_sequen_stack();
//入栈
push_sequen_stack(stack,&p1);
push_sequen_stack(stack,&p2);
push_sequen_stack(stack,&p3);
push_sequen_stack(stack,&p4);
push_sequen_stack(stack,&p5);
push_sequen_stack(stack,&p6);
//如果栈不为空 访问栈顶元素并出栈
while (STACK_NOT_EMPTY == is_empty_sequen_stack(stack))
{
//栈顶元素
struct Person *p_top = top_sequen_stack(stack);
printf("栈顶元素:\n 姓名:%s,年龄:%d\n",p_top->name,p_top->age);
//出栈
pop_sequen_stack(stack);
}
//当前栈的大小
stack_size = size_sequen_stack(stack);
printf("栈的大小:%d\n",stack_size);
//销毁栈
destroy_sequen_stack(stack);
}
main.c:程序入口
#include "includes.h"
//主函数
int main(void)
{
//功能测试
function_test();
return 0;
}
运行结果: