【数据结构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 data[10];

int pos;

};

2、struct stack k1;

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

(1)压栈细分

递增空栈

k1.data[k1.pos] = e;

k1.pos++;

递增满栈

k1.pos++;

k1.data[k1.pos] = e;

递减空栈

k1.data[k1.pos] = e;

k1.pos--;

递减满栈

k1.pos--;

k1.data[k1.pos] = e;

(2) 弹栈细分

递增空栈

k1.pos--;

e = k1.data[k1.pos];

递增满栈

e = k1.data[k1.pos];

pos--;

递减空栈

k1.pos++;

e= k1.data[k1.pos];

递减满栈

e = k1.data[k1.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->data[pos];返回栈顶元素的值

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)

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

相关推荐
khalil10209 小时前
代码随想录算法训练营Day-34动态规划03 | 01背包问题 二维、01背包问题 一维、416. 分割等和子集
数据结构·c++·算法·leetcode·动态规划·背包问题·01背包
空中海9 小时前
Redis 从零到精通:9大数据结构 × 11个高频工程实战场景完全手册
数据结构·数据库·redis
地球资源数据云10 小时前
1951-2025年中国逐年1千米逐月总降水量区域统计数据集_年表_县
大数据·数据结构·数据库·数据仓库·人工智能
cpp_250111 小时前
P2639 [USACO09OCT] Bessie‘s Weight Problem G
数据结构·算法·动态规划·题解·洛谷·背包dp
郝学胜-神的一滴11 小时前
[力扣 227] 双栈妙解表达式计算:从思维逻辑到C++实战,吃透反向波兰式底层原理
java·前端·数据结构·c++·算法
菜鸟丁小真12 小时前
LeetCode hot100 -131.分割回文串
数据结构·算法·leetcode·知识点总结
数智化精益手记局12 小时前
8d报告案例分析:拆解8d报告案例分析的8个步骤,解决生产现场重复发生的质量难题
大数据·数据结构·数据库·人工智能·精益工程
笨笨饿12 小时前
66_C语言与微控制器底层开发
linux·c语言·网络·数据结构·算法·机器人·个人开发
AI人工智能+电脑小能手12 小时前
【大白话说Java面试题】【Java基础篇】第10题:HashMap中的元素是有序存放的吗
java·开发语言·数据结构·后端·面试·哈希算法·哈希表
牢姐与蒯13 小时前
c++数据结构之二叉搜索树
数据结构·c++·搜索