用c语言简易实现栈

目录

前言:

一、理解栈

         1.定义

2.思维导图 

二、栈的实现 

 1.声明功能,定义在Stack.h文件中

2.实现功能的代码 


前言:

大家好呀!(●'◡'●) 首先欢迎您能够浏览我的文章,希望我的文章能够帮助到你,或者给我指出其中的错误都可以啦~o((>ω< ))o  这是我学习过程中对c语言实现栈的一些理解,我们往下冲冲冲吧!

一、理解栈

 

1.定义

栈,属于数据结构中的一种,它是属于线性结构的。通常我们对栈的操作就是压栈和出栈,这也限定仅在表尾进行插入和删除操作的线性表 ,而这个表尾也就是栈顶,另一端就是栈底了。

简单一点来说就是先进后出 后进先出。可以类比一下往一个狭窄的箱子里放东西,放完后,拿出来的总是后面放的,而放这个动作就是压栈,拿出来就是出栈。

2.思维导图 

下面用一个思维导图简述一下栈所要实现的具体功能 :

 

 那么这里,我们要实现这些功能,肯定是要选择一个结构的,数组或者链表。我们想一下,既然是栈,我们存储数据是尾插,似乎数组和单链表都可以,但是,我们统计数据的时候,链表的话就需要遍历,在链表里添加变量统计个数的话稍微又麻烦,所以这里实现我选择的是数组,动态的

 

二、栈的实现 

 1.声明功能,定义在Stack.h文件中

(注:使用编译器为vs2022)

Stack.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include <stdbool.h>//能够让c语言使用布尔类型的c语言

//数据类型
typedef int STDataType;

//定义栈的结构  我们用数据结构来表示
typedef struct Stack
{
    STDataType* x;
    int top;//实时储存
    int capacity;//容量
}ST;

//初始化函数
void StackInit(ST* ps);
//将此栈摧毁
void StackDestroy(ST* ps);
//压栈
void StackPush(ST* ps, STDataType x);
//出栈
STDataType StackTop(ST* ps);
//出栈 弹出数据
void StackPop(ST* ps);
//判断是否存在数据
bool StackEmpty(ST* ps);
//当前存在的数据个数
int StackSize(ST* ps);

 

2.实现功能的代码 

Stack.c 

#include"Stack.h"

//初始化函数
void StackInit(ST* ps)
{
    assert(ps);
    ps->x = NULL;
    ps->top = 0;
    ps->capacity = 0;
}

//摧毁栈
void StackDestroy(ST* ps)
{
    assert(ps);
    free(ps->x);
    ps->x = NULL;
    ps->top = 0;
    ps->capacity = 0;
}

//压栈   实际上在顺序表的基础上禁止了头插而已,所以实际上就是一个尾插而已
void StackPush(ST* ps, STDataType x)
{
    assert(ps);

    //第一类情况:首次进来和容量不足的情况
    if (ps->top == ps->capacity)
    {
        int newcapcity = (ps->capacity == 0) ? 4 : (ps->capacity) * 2;//三目运算符确定
        STDataType* temp = (STDataType*)realloc(ps->x, sizeof(STDataType));
        if (temp == NULL)
        {
            printf("未能申请到空间呢\n");
            exit(-1);
        }
        ps->x = temp;
        ps->capacity = newcapcity;
    }

    ps->x[ps->top] = x;
    ps->top++;
}
//出栈 -输出数据
STDataType StackTop(ST* ps)
{
    assert(ps);
    assert(!StackEmpty(ps));//确保里面还存在数据

    return ps->x[ps->top - 1];
}
//出栈 弹出数据
void StackPop(ST* ps)
{
    assert(ps);
    assert(!StackEmpty(ps));
    ps->top--;
}

//判断是否存在数据
bool StackEmpty(ST* ps)
{
    assert(ps);

    //if (ps->top == 0)
    //    return 1;
    //else
    //    return 0;

    //return ps->top == 0 ? 1 : 0;

    return ps->top == 0;
}

int StackSize(ST* ps)
{
    assert(ps);

    return ps->top;
}

依次实现即可,其实它就是在实现顺序表的前提下做了一些特定的修正而已,在实现具体的功能上和顺序表略有差别,比如随机访问。

随后的测试代码自己测试就好啦 !

共同进步吧! 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值