【数据结构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)

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

相关推荐
橙淮14 小时前
二叉树核心概念与Java实现详解
数据结构·算法
困意少年17 小时前
队列:先进先出为什么特别适合“流程推进”这类问题
数据结构
2501_9219608517 小时前
协同本体论 V4.2+:离散关系拓扑涌现连续时空几何的数值验证
数据结构·人工智能·重构
橙淮18 小时前
Java数组与链表:特性对比与应用场景
数据结构·算法
故事和你9119 小时前
洛谷-【图论2-1】树4
开发语言·数据结构·c++·算法·动态规划·图论
故事和你9119 小时前
洛谷-【图论2-1】树1
开发语言·数据结构·c++·算法·深度优先·动态规划·图论
普马萨特20 小时前
地理空间索引技术选型指南:GeoHash, Google S2 与 Uber H3
数据结构
谙弆悕博士21 小时前
【附C源码】二叉搜索树的C语言实现
c语言·开发语言·数据结构·算法·二叉树·项目实战·数据结构与算法
宵时待雨21 小时前
回溯算法专题2:二叉树中的深搜
开发语言·数据结构·c++·笔记·算法·深度优先
澈2071 天前
平衡二叉树:AVL与红黑树终极对比
数据结构·c++·红黑树