数据结构——线性结构(2)——链栈中的push和pop操作

链栈

尽管数组是堆栈最常见的底层表示形式,但也可以使用链表实现Stack类。 如果这样做,空堆栈的概念表示就是NULL指针:
这里写图片描述
当你将新元素推入堆栈时,该元素只会添加到链表的前端。因此,如果将元素e1 push到空栈上,该元素将存储在一个新单元格中,该单元格将成为链中唯一的链接:
这里写图片描述
将一个新元素push栈将该元素添加到链的开头。所涉及的步骤与将字符插入链表列表缓冲区所需的步骤相同。 首先分配一个新的单元格,然后输入数据,最后更新链接指针,使新单元格成为链中的第一个元素。 因此,如果将元素e2推到栈上,将得到以下配置:
这里写图片描述
在链表表示中,pop操作包括删除链中的第一个单元格并返回存储在该列中的值。因此,来自上图所示的栈的pop操作返回e2并恢复栈的先前状态,如下所示:
这里写图片描述

对链栈中pop和push的分析

先看一下这两个功能的实现(我们以数字栈为例子):

class StackInt {          // in StackInt.h
public:
    StackInt ();          // constructor

    void push(int value); // append a value 
    int pop();            // return the first-in value

private:
    struct Node {
      int value;
      Node * link;
    };
    Node * data;     // member variables
};

我们先看看我们的push功能:

void StackInt::push(int v) {
    Node * temp = new Node;
    temp->value = v;
    temp->link = data;
    data = temp;
}

链栈是链表的一种,我们当然要画图去理解这个过程:
(1) Node* data这句话的意思我们说过,就是建立一个指向这组数据的首指针,如图:
这里写图片描述
(2)这个时候我们要push(7),因此我们的目的应该是这样的:
这里写图片描述
(3)代码的前两句,是建立一个指向新的Node的指针,然后为新建的节点赋值为7,如下:
这里写图片描述
(4)这里我们好像可以把第三句删了,直接 data = temp; 让我们看看会发生什么?
这里写图片描述
(5)这里我们很明显看到,如果这样做,那么data就直接指向新的节点,但是新的节点并没有链接到我们的下一个数据,相当于断开了,因此正确的应该是这样:
这里写图片描述
然后:
这里写图片描述
(6)最后我们可以执行删除操作,把我们的temp空间删除,大功告成!!
这里写图片描述

我们再看看我们的pop功能

int StackInt::pop() {
    int toReturn = data->value;
    Node * temp = data;
    data = temp->link;
    delete temp;
    return toReturn;
}

(1)首先我们把我们要pop出去的值给保存起来,定义一个新的变量:
这里写图片描述
(2)如果我们直接用 data = data->link;而不建立临时的空间,我们来看看如果这样会怎么样
这里写图片描述
(3)这显然不是我们想要的,所以我们接着再试一次,首先我们建立临时变量:
这里写图片描述
(4)然后我们将temp的link直接赋值给我们的data。如下;
这里写图片描述
(5)最后删除节点,然后返回原来的值就ok了
这里写图片描述

push和pop的算法复杂度

由于我们并没有涉及到其他的数据移动,我们只是进行了一次的插入删除操作,所以他们的算法复杂度均为我们的O(1)

下一篇我们就用通用的模板来实现我们一般的链栈结构!

  • 16
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值