数据结构-栈的实现(c语言)

栈的定义:先进后出

        栈是一种线性表,但是栈限制了操作,它只允许在一端进行插入和删除。

        栈顶:栈顶是允许插入和删除的那一端

        栈底:栈底是不允许插入和删除的

栈的实现:

        一般在实现栈的时候,通常用数组去模拟实现栈的顺序存储。

        

//.h 文件

#ifndef SEQSTACK_H
#define SEQSTACK_H

#define MAX_SIZE 1024
#define SEQSTACK_TRUE 1
#define SEQSTACK_FALSE 0


//定义栈的结构体
typedef struct SEQSTACK
{
    void* data[MAX_SIZE];    //用来模拟栈的存储空间
    int size;                //用来记录栈的大小
}SeqStack;

//栈的初始化
SeqStack* Init_SeqStack();

//插入
void Insert_SeqStack(SeqStack* stack,void* data);

//弹出栈
void Pop_SeqStack(SeqStack* stack);

//返回栈顶元素
void* Top_SeqStack(SeqStack* stack);

//返回栈中元素的个数
int Size_SeqStack(SeqStack* stack);

//判断栈是否为空
int IsEmpty_SeqStack(SeqStack* stack);

//清空栈
void Clear_SeqStack(SeqStack* stack);

//释放栈的内存
void FreeSpace_SeqStack(SeqStack* stack);


#endif

.c 文件

#include <stdio.h>
#include <stdlib.h>
#include "SeqStack.h"

//栈:先进后出  规则
//    不能遍历
 
// 栈的顺序存储:
// 基本概念:栈的顺心存储结构简称顺序栈:利用一组地址连续的存储单元一次存放自栈低到栈顶的数据元素

//栈的初始化
SeqStack* Init_SeqStack()
{
    SeqStack* stack = (SeqStack*)malloc(sizeof(SeqStack));
    
    for(int i = 0; i < MAX_SIZE; i++)
    {
        stack->data[i] = NULL;    //将栈空间中的每一个单元都置为NULL
    }    

    stack->size = 0;            //将栈元素个数置为0

    return stack;
}

//插入
void Push_SeqStack(SeqStack* stack,void* data)
{
    //只能在栈顶插入元素
    if(stack == NULL)    return;
    if(data == NULL)    return;

    //还需判断栈是否已满
    if(stack->size == MAX_SIZE)    return;

    stack->data[stack->size] = data;
    stack->size++;
}

//弹出栈
void Pop_SeqStack(SeqStack* stack)
{
    //只能弹出栈顶元素
    if(stack == NULL)    return;
    //需要判断栈中是否已经为空
    if(stack->size == 0)    return;

    //将弹出的单元置空
    stack->data[stack->size - 1] = NULL;
    stack->size--;
}

//返回栈顶元素
void* Top_SeqStack(SeqStack* stack)
{
    if(stack == NULL)    return;
    if(stack->size == 0)    return;

    return stack->data[stack->size -  1];
}

//返回栈中元素的个数
int Size_SeqStack(SeqStack* stack)
{
    if(stack == NULL)    return -1;
    
    return stack->size;
}

//判断栈是否为空
int IsEmpty_SeqStack(SeqStack* stack)
{
    if(stack == NULL)    return -1;

    if(stack->size == 0)    return SEQSTACK_TRUE;
    
    return SEQSTACK_FALSE;
}

//清空栈
void Clear_SeqStack(SeqStack* stack)
{
    if(stack == NULL)    return;

    if(stack->size == 0)    return;

    for(int i = stack->size - 1; i >= 0; i--)
    {
        stack->data[i] = NULL;
    }
    stack->size = 0;
}

//释放栈的内存
void FreeSpace_SeqStack(SeqStack* stack)
{
    if(stack == NULL)    return;
    free(stack);
}


int main()
{
    return 0;
}


#endif

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值