C语言--栈的顺序存储

栈的定义(摘自百度百科):

栈(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;
}

运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值