【数据结构6】栈的四种形态:递增/递减,满栈/空栈深度解析

目录

一、栈的类型

(1)压栈细分

[(2) 弹栈细分](#(2) 弹栈细分)

二、栈的结构体类型定义如下

三、栈的接口

四、递增空栈接口的实现

[4.1 初始化接口](#4.1 初始化接口)

[4.2 压栈](#4.2 压栈)

[4.3 弹栈](#4.3 弹栈)

[4.4 获取栈顶元素](#4.4 获取栈顶元素)

[4.5 判断栈是否为空](#4.5 判断栈是否为空)

[4.6 判断栈是否为满](#4.6 判断栈是否为满)


一、栈的类型

分满栈和空栈:满栈表示pos指向已有元素位置,空栈表示pos指向待插入位置

递增和递减:分别指 ↑ 和 ↓

1、typedef int element;

结构体定义:struct stack{

element data10;

int pos;

};

2、struct stack k1;

k1.pos=0; // pos初始值依靠具体实现的栈类型决定

(1)压栈细分

递增空栈

k1.datak1.pos = e;

k1.pos++;

递增满栈

k1.pos++;

k1.datak1.pos = e;

递减空栈

k1.datak1.pos = e;

k1.pos--;

递减满栈

k1.pos--;

k1.datak1.pos = e;

(2) 弹栈细分

递增空栈

k1.pos--;

e = k1.datak1.pos;

递增满栈

e = k1.datak1.pos;

pos--;

递减空栈

k1.pos++;

e= k1.datak1.pos;

递减满栈

e = k1.datak1.pos;

k1.data++:

压栈、弹栈原理相同,记住增减方向,空说明指向待插入位置,满说明指向已有元素的位置,不能鸠占鹊巢的话,就识相些先挪窝再添新元素。

二、栈的结构体类型定义如下

复制代码
C

#define MaxStackSize 5

typedef int Element;
typedef struct
{
    Element data[MaxStackSize];
    int top;
}ArrayStack;

三、栈的接口

栈满不能再放新元素,栈空无法弹栈

栈不提供遍历接口,都是根据栈的特性来的,栈的接口设计如下:

复制代码
C

void initArraStack(ArrayStack *stack); 

int pushArrayStack(ArrayStack *stack,Element e);
int popArrayStack(ArrayStack *stack);   
Element getTopArrayStack(const ArrayStack *stack);   

int isEmptyArrayStack(const ArrayStack *stack); 
int isFullArrayStack(const ArrayStack *stack); 

以上为:栈初始化、压栈、弹栈、获取栈顶元素、栈是否为空、栈是否为满接口

四、递增空栈接口的实现

其他类型的接口类似,以递增空栈为例:

4.1 初始化接口
复制代码
C

void initArraStack(ArrayStack *stack)
{
    memset(stack->data,0,sizeof(stack->data));
    stack->top = 0;
}

(1)将栈上申请的存储数据区初始化为0

(2)由于是递增空栈,栈顶初始化为0

如果是递增满栈,则需要初始化为-1

4.2 压栈
复制代码
C

int pushArrayStack(ArrayStack* stack, Element e)
{
    stack->data[stack->top] = e;
    ++stack->top;
}

空栈,stack->top指向的是待插入位置,先赋值后++

4.3 弹栈
复制代码
C

int popArrayStack(ArrayStack* stack)
{
    --stack->top;
}

由于是在栈上申请的数据空间 ,只需要减减就行,数据无需自己清理

4.4 获取栈顶元素
复制代码
C

Element getTopArrayStack(const ArrayStack* stack)
{
    int pos = stack->top-1;
    return stack->data[pos];
}

由于是递增空栈,指向的是待插入位置,先减一后stack->datapos;返回栈顶元素的值

4.5 判断栈是否为空
复制代码
C

int isEmptyArrayStack(const ArrayStack* stack)
{
    return stack->top == 0;
}

栈顶为0即代表栈为空

4.6 判断栈是否为满
复制代码
C

int isFullArrayStack(const ArrayStack* stack)
{
    return stack->top == MaxStackSize;
}

这你就想想定义MaxStackSize为5,从0开始压入元素,0-4就已经满栈,由于是递增空栈,这时候stack->top正好指在5的位置,也就是说stack->top这时候的大小正好为5(MaxStackSize)

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

相关推荐
lightqjx4 小时前
【算法】数据结构_并查集
数据结构·算法·并查集
小蒋学算法5 小时前
算法-掉落的方块-线段树
数据结构·算法
Brilliantwxx5 小时前
【算法从零到千】【8-15】滑动窗口
数据结构·算法
Lucis__5 小时前
图的高阶算法:从构造最小生成树到求解最短路径问题
数据结构·c++·算法·图论
sugar__salt13 小时前
从栈队列数据结构到JS原型面向对象全解
前端·javascript·数据结构
froyoisle16 小时前
CSP-J 历年复赛 T1 及解析(2019~2025)
数据结构·c++·算法·csp-j·csp·算法竞赛·信息学
喜欢打篮球的普通人17 小时前
LLVM 后端流程与关键数据结构:从 IR 到机器码的入门笔记
java·数据结构·笔记
Misnearch17 小时前
1、数组/字符串
java·数据结构·算法
008爬虫实战录17 小时前
【数据结构】 树、二叉树、完全二叉树,先序遍历、中序遍历、后序遍历
数据结构·算法
AllData公司负责人17 小时前
大模型赋能AllData数据中台,系列升级|通过联合智谱大模型与BiSheng开源项目,建设企业大模型应用开发平台,支持知识库向量检索!
大数据·数据结构·数据库·算法·大模型·向量数据库·智谱ai