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

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

相关推荐
※DX3906※15 小时前
Java排序算法--全面详解面试中涉及的排序
java·开发语言·数据结构·面试·排序算法
Chan1616 小时前
LeetCode 热题 100 | 矩阵
java·开发语言·数据结构·算法·spring·java-ee·intellij-idea
im_AMBER17 小时前
Leetcode 136 最小栈 | 逆波兰表达式求值
数据结构·学习·算法·leetcode·
识君啊17 小时前
Java字符串算法核心攻略
java·数据结构·算法·leetcode·字符串·
郝学胜-神的一滴17 小时前
力扣86题分隔链表:双链表拆解合并法详解
开发语言·数据结构·算法·leetcode·链表·职场和发展
gihigo199817 小时前
SSA奇异谱分解:时频域信号成分分析与重构
数据结构·算法·重构
程序员阿鹏17 小时前
73.矩阵置零
数据结构·算法·矩阵
一叶落43817 小时前
LeetCode 191. 位1的个数(Hamming Weight)——三种解法详解(C语言)
c语言·数据结构·算法·leetcode
仰泳的熊猫17 小时前
题目1882:蓝桥杯2017年第八届真题-k倍区间
数据结构·c++·算法·蓝桥杯
逆境不可逃17 小时前
【从零入门23种设计模式16】行为型之迭代器模式
java·开发语言·数据结构·算法·设计模式·职场和发展·迭代器模式