【数据结构】栈的基本概念 | 从零开始实现数组栈 | 画图解析 | 数组栈与链式栈

本文详细介绍了栈的概念、结构,重点讲解了数组栈的实现,包括初始化、销毁、判断栈是否为空、入栈、出栈、返回栈顶数据以及计算栈的大小等操作。栈是一种后进先出的数据结构,数组栈在实现上具有高效性。文章还对比了数组栈和链式栈的优缺点,强调了动态栈的实用性。
摘要由CSDN通过智能技术生成

前言:

本章我们将学习 "栈" ,首先介绍栈的概念和结构,然后我们将着重讲解数组栈的实现。我们从零开始写数组栈的接口,并从零开始步步解读。本章旨在筑牢栈知识点的基础,对后续的刷题有着很大的帮助。

一、栈(stack)

0x00 栈的概念

 栈的概念:

① 栈是一种特殊的线性表,它只允许在固定的一端进行插入和删除元素的操作。

② 进行数据插入的删除和操作的一端,称为 栈顶  。另一端则称为  栈底  。

③ 栈中的元素遵守 后进先出 的原则,即  LIFO原则 (Last In First Out)。

压栈:栈的插入操作叫做 进栈 / 压栈 / 入栈 ,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

0x01 栈的结构

 栈的结构:

0x02 数组栈和链式栈

 实现栈无非就两种结构: 数组结构  和 链式结构 ,两种结构都可以实现。

:question: 数组栈和链式栈哪种结构更好?

 相对而言 数组的结构实现更优 ,尾插尾删的效率高,缓存利用率高,它的唯一缺点只是增容,但是增容1次扩2倍对栈来说本身就比较合理,是无伤大雅的。而链式栈虽然不会空间浪费,用一个 malloc 申请一个,但是链式栈存在一个致命的缺点:单链表不好出数据,必须要实现双向链表,否则尾上删除数据将会异常麻烦。

 如果硬要使用链式栈:

① 如果用尾做栈顶,尾插尾删,要设计成双向链表,否则删数据效率低。

② 如果用头做栈顶,头插头删,就可以设计成单链表。

 总结:本章栈的实现将采用数组结构!

二、栈的定义

0x00 动态栈

 注意:本章将采用动态栈实现!

typedef int StackDataType;

typedef struct Stack {
	StackDataType* array;  //数组
	int top;               //栈顶
	int capacity;          //容量
} Stack;

 解读:顺序表相信大家已经很熟了,这里和顺序表没啥两样。创建结构体,结构体有三个变量, array 是用来存放数据的数组。 top 用来表示栈顶,这里相当于顺序表中的 size 变量。capacity 表示栈的容量。

0x01 静态栈

 简单介绍下静态栈:

typedef char StackDataType;
#define N 10

typedef struct Stack {
	StackDataType _array[N];  //数组
	int _top;                 //栈顶
} Stack;

 解读: N 给多了浪费给少了又不够用,所以静态栈在实际中是不实用的。静态栈满了就不能扩大了,而动态栈是 malloc 出来的,不够了可以 realloc 扩容。虽然不实用,但是我们也得认识它,知道有这么一个东西,以后见到不至于觉得奇怪。

0x02 接口函数

 这是需要实现几个接口函数:

void StackInit(Stack* psl);
void StackDestroy(Stack* psl);
bool StackIfEmpty(Stack* psl);
void StackPush(Stack* psl, StackDataType x);
void StackPop(Stack* psl);
StackDataType StackTop(Stack* psl);
int StackSize(Stack* psl);

 解读:相信细心的小伙伴发现了, StackIfEmpty 函数的类型是 布尔 。C语言如果想使用布尔值需要引入头文件  #include <stdbool.h> 。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值