链表----栈

187 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

顺序表的按位查找

获取表L中第i个位置的元素的值。

静态分配:

image.png 动态分配:

image.png

顺序表的按值查找

在表L中查找具有给定关键字值的元素。

image.png

按值查找的时间复杂度:(最深层循环语句的执行次数和问题规模n的关系)

最好情况:目标元素在表头,循环一次O(1) 最坏情况:目标元素在表尾,循环一次O(n) 平均:O(n)

在C语言中不能用“==”直接判断两个结构体是否相等的。(C++可以尝试重载)

image.png LocateElem(L,e)在顺序表L中查找第一个元素值等于e的元素,并返回其位序,从第一个元素开始依次往后检索。

单链表

typedef关键字---数据类型重命名

image.png

声明头指针,因为带头结点的代码写起来更方便,头结点的下一个节点才能存放数据。

image.png

* 单链表(带头结点)按位序插入

在表L中第i位置上插入指定元素e。

i=1(插在表头) image.png 黄色箭头和绿色箭头不能颠倒。

i=3(插在表中)

image.png

单链表(不带头结点)按位序插入

image.png

指定结点的后插操作

image.png

指定结点的前插操作

image.png

删除结点(带头结点)

image.png 如果p是最后一个结点,只能从表头开始依次寻找p的前驱,这就是单链表的局限性:无法逆向检索,有时不方便,∴该段代码有点小bug,指定结点是最后一个节点时,需特殊处理,问题不大。

封装的好处

image.png

image.png

按位查找

获取表L中第i个位置的元素的值。

i=8不合法

image.png

按值查找

获取表L中查找具有给定关键字值的元素。

image.png

求表长度

image.png

顺序表可以借助一维数组实现(加长度)。
在链式存储结构下,线性表的存储空间可以是分散不连续的。

双链表

image.png

静态链表

不用指针时,想要发挥链表结构的长处可以用一个二维数组来模拟。

静态链表便于插入和删除。
静态链表需要分配较大空间,插入和删除不需要移动元素。

只允许在一段进行插入或删除的线性表(基础为顺序表),先进后出。

image.png

上溢出----当栈满时,再做栈运算产生空间溢出的现象。
下溢出----当栈空时,作退栈运算产生的溢出现象。

共享栈

image.png

链栈

image.png 先进先出

image.png 顺序栈和链栈的比较:

时间:基本操作时间复杂度都为O(1)
空间:初始顺序栈必须确定一个固定的长度,所以有存储元素个数的限制和
空间浪费的问题。链栈无栈满问题,只有内存无才会栈满,但每个元素都要
一个指针域,增大开销。

image.png 栈的应用:主要在括号匹配、表达式求值、递归中。 中缀求后缀,划括号,将括号内的运算符放到该括号后,再去括号。 中缀求前缀,划括号,将括号内的运算符放到该括号前,再去括号。

image.png

image.png