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

运行结果:

顺序是一种基于数组实现的,它的特点是具有随机存取的特性。顺序的基本运算包括进、出和查看顶元素。进操作将元素插入到顶,出操作将顶元素删除并返回,查看顶元素操作返回顶的元素值,但不修改的状态。 在C语言中,顺序的存储结构可以使用一个一维数组来存放中的元素,同时使用一个指示器top来指示顶的位置。在进行进和出操作时,需要更新top的值,使其指向顶元素。 下面是一种常见的顺序的定义和基本操作的示例代码: ```c // 定义中元素的数据类型 typedef int StackElementType; // 定义顺序的存储结构 #define Stack_Size 100 // 的最大容量 typedef struct { StackElementType elem[Stack_Size]; // 用数组存放中元素 int top; // 顶指针 } SeqStack; // 初始化顺序 void Init_SeqStack(SeqStack *S) { S->top = -1; // 初始时为空,顶指针置为-1 } // 进操作 void Push_SeqStack(SeqStack *S, StackElementType x) { if (S->top == Stack_Size - 1) { printf("已满,无法进"); return; } S->top++; // 顶指针加1 S->elem[S->top] = x; // 将新元素放入顶位置 } // 出操作 StackElementType Pop_SeqStack(SeqStack *S) { if (S->top == -1) { printf("为空,无法出"); return -1; // 返回一个特殊值表示出错 } StackElementType x = S->elem[S->top]; // 获取顶元素的值 S->top--; // 顶指针减1 return x; // 返回顶元素的值 } // 查看顶元素 StackElementType GetTop_SeqStack(SeqStack *S) { if (S->top == -1) { printf("为空"); return -1; // 返回一个特殊值表示出错 } return S->elem[S->top]; // 返回顶元素的值 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值