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

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

相关推荐
wang09079 分钟前
硬着头皮学数据结构和算法之Myers算法
数据结构·算法
垆边人似月.37 分钟前
华为机试题 :最长递增子序列题目
数据结构·c++·算法·华为
yi01112 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
禾小西15 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
H.莓飛15 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有16 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
chenbingjie_c17 小时前
C++ STL 适配器:stack & queue,从 vector/list 到 deque 深度解析
数据结构·c++
垆边人似月.20 小时前
华为OD算法题:查找众数及中位数
数据结构·算法·leetcode
CoderYanger20 小时前
一轮复习——F.动态规划模型总结(入门篇)
java·开发语言·数据结构·算法·leetcode·职场和发展·动态规划
一只旭宝21 小时前
数据结构与算法复习手册:从写过,到讲清楚
开发语言·数据结构·c++·算法