【数据结构】【线性表】栈的顺序存储实现(附C语言源码)

ops/2024/11/24 3:56:07/

顺序栈

        • 栈的顺序存储实现
          • 顺序栈的定义
          • 顺序栈的初始化
          • 进栈
          • 出栈
          • 读栈顶元素
          • 共享栈

栈的顺序存储实现

在之前的内容中我们讲过,栈也是线性表的一种,它和顺序表以及链表的区别不在存储结构上,而是在删除和插入的操作上,栈只允许在其一端进行插入或删除的操作。因此栈的实现可以和顺序表类似,也可以和链表类似,在这里,我们先介绍一下栈的顺序存储实现。顺序存储顾名思义,内存空间练习,元素顺序和存储顺序一致。

顺序栈的定义
define MaxSize 10//定义栈中元素的最大个数
typedef struct{ElemType data[MaxSize];//用数组存放各个元素,Elemtype表示任意数据类型int top;//栈顶指针
}SqStack;

内存分别大致如图所示:
在这里插入图片描述

顺序栈的初始化

将顺序栈初始化为空栈,为了清除顺序栈中元素数据,可以先遍历将各元素的data设置成一个特定的值,并将栈顶指针设置为负数(因为非空栈的栈顶指针必定为非负数)

void InitStack(SqStack &S,ElemType e){for(int i=0;i<MaxSize;i++){S.data[i]=e;}S.top=-1;
}
进栈

新的元素进栈需要先判断栈是否满员,防止上溢;在栈有剩余空间的前提下,先将栈顶指针+1,然后将元素放入其中。

bool PushStack(SqStack &S,ElemType e){if(S.top==MaxSize-1)//判断顺序栈是否满员return flase;//顺序栈已满,进栈失败S.top=S.top+1;//栈顶指针先+1S.data[S.top]=e;//元素进栈return true;//进栈成功
}
出栈

将元素出栈需要先判断栈是否为空栈,在不是空栈的情况下,先将元素出栈,然后栈顶指针-1.

bool PopStack(SqStack &S,ElemType &e){if(S.top==-1)//判断是否空栈return false;//空栈,出栈失败e=S.data[S.top];//数据出栈S.top=S.top-1;//栈顶指针-1return true;//出栈成功
}

这里需要注意的是,顺序结构里的出栈,不会真正的删除该元素,元素数据还保留在原来的内存中,只是从逻辑上删除了,top相当于一个盖子,让栈不会越过盖子访问下一个内存,视为删除(出栈)

读栈顶元素

类似于出栈,不同的在于我只需要读出栈顶元素的数据内容,不需要改变其栈顶指针

bool ReadTop(SqStack &S,ElemType &e){if(S.top==-1)//判断是否空栈return false;//空栈,读栈顶元素栈失败e=S.data[S.top];//读取栈顶数据return true;//读栈顶成功
}
共享栈

两个栈共享一个空间,内存分布大致情况如图所示:
!

共享栈公用同一片连续空间,两端分别为各自的栈底,两个栈的栈顶向其共享空间延申。
其结构体构建为:

define MaxSize 10//定义栈中元素的最大个数
typedef struct{ElemType data[MaxSize];//用数组存放各个元素,Elemtype表示任意数据类型int top1;//栈顶指针1int top2;//栈顶指针2
}SqStack;

我们在初始化时需要注意栈顶指针的赋值,应当分别赋值给两端;同时为了清除数据,也可以将内存中各个元素赋予一个特定的值e,例如e=0;

void InitStack(SqStack &S,ElemType e){for(int i=0;i<MaxSize;i++){S.data[i]=e;}S.top1=-1;S.top2=MaxSize;
}

共享栈的入栈和出栈的方法思路和正常栈是一致的,但也有几点注意事项需要说明一下:

  • 共享栈共享同一个空间,栈底不是固定不变的,当两个栈顶指针相邻时,说明满栈,如图所示:
    在这里插入图片描述
满栈的判定条件为:top1==top2-1;
  • 共享栈空栈则二者的top都为初始化的值:
top1=-1;
top2==MaxSize;
  • 需要注意的是,满栈判定什么两个栈均已满,但空栈判定只说明单个栈是空栈,也可能存在一个栈是空栈,另一个栈是满栈,此时的空栈没有剩余空间了,也视为满栈。

http://www.ppmy.cn/ops/135837.html

相关文章

PostgreSQL 性能优化全方位指南:深度提升数据库效率

PostgreSQL 性能优化全方位指南&#xff1a;深度提升数据库效率 别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01; 在现代互联网应用中&#xff0c;数据库性能优化是系统优化中至关重要的一环&#xff0c;尤其对于数据密集型和高并发的应用而言&am…

摄像机ISP和DSP的区别?

影像处理器是现代数字相机、手机等电子设备中极其重要的一部分&#xff0c;它能够对传感器采集的图像进行多种操作&#xff0c;从而得到更高质量的图像。常见的两种影像处理芯片有ISP&#xff08;Image Signal Processor&#xff09;和DSP&#xff08;Digital Signal Processor…

从0开始的数据结构速过——番外(1)

目录 尝试 思考与架构设置 编写&#xff01; 一些额外知识的补充 可变参数模板 std::common_type std::forward 这是《数据结构从0开始》的一个番外。实际上是介绍一下一些现代C的写法。这里以快速构建std::array作为契机来说明一下一些现代C的语法。 尝试 我们在这里呢…

超越GPT-4o-mini | 北大开源「国产o1」大模型,{多阶段自主推理}让小模型也能“放大招“!

01、LLaVA-o1背景简介 以OpenAI o1为代表的大型语言模型展示了强大的推理能力&#xff0c;这充分的验证了语言模型推理时间缩放的有效性。然而&#xff0c;视觉对于使模型能够充分理解世界并扩展其认知能力同等重要。因此&#xff0c;开发一个融合语言和视觉的多模态模型&#…

网络安全问题概述

1.1.计算机网络面临的安全性威胁 计算机网络上的通信面临以下的四种威胁&#xff1a; (1) 截获——从网络上窃听他人的通信内容。 (2) 中断——有意中断他人在网络上的通信。 (3) 篡改——故意篡改网络上传送的报文。可应用于域名重定向&#xff0c;即钓鱼网站。 (4) 伪造——伪…

MySQL更换瀚高语法更换

MySQL更换瀚高语法更换 一、前言二、语句 一、前言 水一篇,mysql更换瀚高之后&#xff0c;一些需要更换的语法介绍 > 二、语句 MySQL瀚高MySQL用法瀚高用法说明ifnull(x,y)coalesce(x,y)相同相同用于检查两个表达式并返回第一个非空表达式。如果第一个表达式不是 NULL&…

shell脚本2---清风

声明&#xff1a; 本文的学习内容来源于B站up主“泷羽sec”视频“蓝队基础之网络七层杀伤链”的公开分享&#xff0c;所有内容仅限于网络安全技术的交流学习&#xff0c;不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题&#xff0c;请联系本人&#xff0c;我将立即删除相…

San与s-ref

写在前面 最近在实习过程中有用到 san框架&#xff0c;遇到的一些问题记录下来&#xff1a; 如何使用 在 San 框架中&#xff0c;s-ref 指令用于为元素或组件分配引用名称&#xff0c;方便在组件实例中通过 this.ref 访问对应的 DOM 元素或子组件。 1、使用方法&#xff1a; …