大话数据结构第四章栈的基本概念与出栈入栈操作
一、栈的顺序存储结构
1.基本概念
栈顶就是表尾。
栈顶是栈插入和删除的地方。
栈就是只允许在表尾进行添加或删除,是顺序存储结构线性表的特例或者说简化。
为什么说是简化呢?相对于顺序存储结构来说栈只允许在表尾插入和删除,而顺序存储结构线性表是可以在任何位置插入和删除的。所以简化了,我固定位置了。
栈或者队列是固定插入和删除的位置的顺序存储结构的线性表。
具体区分:
栈是固定一端的位置进行插入和删除的顺序存储结构的线性表。
队列是将插入和删除分在两端的顺序存储结构的线性表。
队列:在一端添加,在另一端删除。
2.栈的生长方向
假如栈的长度为n,则数组下标范围为0 ~(n-1)
向上生长:入栈时,栈顶元素下标递增,栈底是数组元素0。空栈的判断一般是栈顶指针是否为-1,当然也有另一种栈的实现方法就是以0为空栈的判断依据。
向下生长:入栈时,栈顶元素下标递减,栈底是数组元素n-1。空栈的判断一般是栈顶指针是否为n,当然也有另外一种栈的,实现方法是以n-1为空栈的判断依据。
因为向上生长的栈,入栈1个元素时,栈顶是元素0,空栈时-1;
而向下生长的栈,入栈1个元素时,栈顶为元素n-1,那空栈时就是n了。
第一,向上生长方向,入栈时是递增方向,出栈时是递减。即递增入栈,递减出栈。
(1)向上生长方向的第1种实现方法。——栈顶本身指向有出栈入栈的数据,它是出栈入栈的最后一个数据指向,本身指向出栈入栈的数据。
以栈顶指向-1为空栈,以栈顶指向n-1为栈满。
它入栈push思路:先判断是否栈满(栈顶为n-1),满的话就返回错误。栈没满,栈顶先自增1,再把数据写入栈里。
它出栈pop思路:先判断是否空栈(栈顶为-1),空栈了就没啥可出了,返回错误。否则,先把栈顶内容读出,栈顶指针再自减1。
(2)向上生长方向的第2种实现方法。——数据在栈顶下面,每次入栈出栈栈顶指向事屋顶一样,屋顶下面才是入栈出栈的数据,栈顶本身的指向只是个界限。
以栈顶指向0为空栈,以栈顶指向n为栈满。
它入栈push思路:先判断是否栈满(栈顶为n),满的话就返回错误。栈没满,先把数据写入栈里,之后栈顶才自增1。
它出栈pop思路:先判断是否空栈(栈顶为n),空栈了就没啥可出了,返回错误。否则,栈顶指针先自减1,再把栈顶内容读出。
第二向下生长方向n-0。递减入栈,递增出栈。
以栈顶指向n为空栈,以栈顶指向0为栈满。 它入栈push思路:先判断是否栈满(栈顶为0),满的话就返回错误。栈没满,栈顶先自减1往下移,再把数据写入栈里。 它出栈pop思路:先判断是否空栈(栈顶为0),空栈了就没啥可出了,返回错误。否则,先把栈顶内容读出,栈顶指针再自增1。
以上情况如下图。
当然,还有下面这种情况:
三、链栈
链栈不需要头结点的。
栈顶在链表表头,也就是链表的第一个节点。
3.1有个问题
问题:形参linkstack *S,这个传入之前肯定要定义一个栈顶节点,这个就固定不变了,之更新栈顶top指针就完事了,假如是linkstack a,那么传入push(&a,3),在传入之前是不是要初始化a?
答:要初始化为0。比如
linkstack a={0,0};
push(&a,3);
再问:为啥?linkstack 是个结构体,里面有个链表节点的指针的,这个链表节点的指针变量要赋为0?那这个链表节点指针为零,那它又是个结构体内部有数据域和指针域,也需要全赋为0吧?
答:只是一个指针,地址。指针是一个存储单元,4个字节
答:我明白了,
linkstack a={0,0};
虽然linkstack是个结构体,但是里面就是2个元素:一个是地址变量(指针),一个计数(普通变量)。
定义a的目的是保存链栈的栈顶指针,也就是固定这个a来保存链栈的头结点,那么初始化为0,是指链栈的栈顶的指针为空,就是目前这个链栈为空么,没有链表,所以栈顶指向为空。——还是指针没学好。
3.2顺序栈和链栈
顺序栈和链栈的出栈入栈的时间复杂度都为O(1),因为没有循环。
在空间上,若空间确定就用顺序栈,若不确定就用链栈。
如果使用过程中元素变化不可预料,有时很小,有时非常大,那么最好是用链擒,反之,如果它的变化在可控范围内,建议使用顺序棋会更好一些。
大话数据结构第四章栈的基本概念与出栈入栈操作相关推荐
- 大话数据结构第四章栈的应用
一.斐波契那数列 就是下一项的值等于相邻的上两项元素之和. 这个规律就是斐波契那数列.由此,我知道这个世界是少不了规律的.就算没有规律也要用规律来逼近描述无规律的现象. 迭代和递归的区别:迭代是循环, ...
- 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法
大话数据结构 第七章 图(二) 最小生成树.最短路径.拓扑排序.关键路径算法 最小生成树 定义 Prim算法 Kruskal算法 最短路径 Dijkstra算法 Floyd算法 拓扑排序 AOV网 拓 ...
- 《大话数据结构》样章试读
<大话数据结构>样章试读 各位童鞋,<大话数据结构>从写作到出版,虽然经历了一些坎坷,但终于还是在今天正式在一些网店发售了.现在提供两章的完整版试读PDF文件,希望能给您有所 ...
- 带父节点的平衡二叉树_学习数据结构--第四章:树与二叉树(平衡二叉树)
第四章:树与二叉树(平衡二叉树) 1.平衡二叉树 平衡二叉树:AVL,任意结点的平衡因子的绝对值不超过一. 平衡因子:左子树高度 - 右子树高度 如上图二叉树,是否是平衡二叉树? 可以把所有结点的平衡 ...
- c#二叉树 取叶子节点个数_数据结构第四章:树与二叉树(二叉树的概念、性质、特殊二叉树)...
第四章:树与二叉树(二叉树的逻辑结构) 1.二叉树 二叉树是树结构的一种,故二叉树也是逻辑结构. 二叉树:二叉树是n(n≥0)个结点的有限集合. · 1)n=0时,二叉树为空; · 2)n>0时 ...
- 广工anyview数据结构第四章(2021.12)
广工anyview数据结构习题第四章, 在学习过程中部分题目参考了Giyn .戮漠.雁过留痕等大佬的代码,在此感谢. 题目解法不是最优解,但希望能给大家有所启发.同时也发了文档资源,需要可自取. 目录 ...
- 算法与数据结构 第四章 树与二叉树
第四章树 一.选择题(20分) 1.在下述结论中,正确的是: ( ) ① 只有2个结点的树的度为1: ② 二叉树的度为2: ③ 二叉树的左右子树可任意交换: ④ 在最大堆(大顶堆)中,从根到任意 ...
- 大话数据结构 摘录 第一章 数据结构绪论
文章目录 启示:数据结构 学习数据机构的重要性 数据结构引发的案例 数据结构的起源 程序设计=数据结构+算法 基础概念与术语 数据 数据元素 数据项 数据对象 数据结构 数据结构:是相互之间存在一种或 ...
- C语言数据结构-第四章 串-电大同步进度
第四章 串 字符串是计算机处理的最基本的非数值数据.字符串是一种特定的线性表,其特殊性就在于组成线性表的每个元素就是一个单字符. 本章给出: l 串的基本概念 l 串的 ...
最新文章
- linux 查看ntp版本号_如何让Linux时间与internet时间同步(CentOS)?
- 神策数据李文浩:企业服务如何破局增长?
- 总结一下qsort()函数的使用与注意
- os模块:与操作系统交互的一个接口
- 洛谷 P1939 【模板】矩阵加速(数列)
- 嵌入式成长轨迹37 【Zigbee项目】【CC2430基础实验】【自动闪烁】
- 容斥原理---概念介绍
- idea抽取重复方法快捷键_使用 IDEA 几分钟就重构了同事800 行quot;又臭又长quot; 的类!真香!...
- c++学习笔记(八)- map
- 导弹拦截(NOIP2010 普及组第三题)
- 经济实惠:组建P2P电影服务器
- 高斯克吕格投影中有关带号与经度的关系
- java语言c语言表情包_c语言表情包 - c语言微信表情包 - c语言QQ表情包 - 发表情 fabiaoqing.com...
- 获取全国所有省份,市区县的中文名和英文名
- 酒店PMS变革之路:开放互联、模块化配置
- win10怎么快速锁定计算机,win10怎么快捷键锁定电脑_win10一键锁屏快捷键是什么-win7之家...
- 《Microduino实战》——1.3 开源软件
- 采用顺序结构存储串,设计实现求串S和串T的一个最长公共子串的算法。
- 离线地图二次开发(支持所有地图源)
- mathtype一步将word自带的公式编辑器的公式换成mathtype类型
热门文章
- 软考倒计时7天:题目书中的易混点
- Virtual Machine Manager 2012 R2利用服务模板部署DC
- Linux中安装.rpm、.tar和.tar.gz或.tgz包
- DataList的使用,Repeater
- Service Worker的应用
- android如何处理大图片大小,android-如何将图像大小减小到1MB
- openlayers之EPSG3857
- spark中dataframe解析_Spark 结构流处理介绍和入门教程
- 深度学习笔记(40) YOLO
- php foreach 循环 判断index 小于多少_Go 与 PHP 的语法对比