Python 数据结构与算法:用链表实现一个栈 栈是一种常见的数据结构,在编程中也经常用到。本文将介绍如何用Python的链表来实现一个栈,以及栈的常用操作。 1. 链表简介 链表是一种数据结构,它由一系列节点组成,每个节点包含两个部分:数据和指向下一个节点的指针。链表有多种类型,如单向链表、双向链表等。 在Python中,链表可以用class来实现。每个链表节点可以定义为一个class,它包含数据和指向下一节点的指针两个部分。下面是一个单向链表节点的代码实现: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next ``` 其中,val表示节点的数据,next表示指向下一节点的指针。如果next为None,则表示当前节点是链表的最后一个节点。 2. 栈的定义 栈是一种线性数据结构,它具有“后进先出”的特点。栈可以用链表来实现,每次添加元素都在链表头进行,每次删除元素也是从链表头进行。 栈的常用操作有:入栈(push)、出栈(pop)、获取栈顶元素(top)、判断栈是否为空(empty)等。 下面是一个用链表实现栈的代码实现: ```python class LinkedListStack: def __init__(self): self.head = None def push(self, val): node = ListNode(val) node.next = self.head self.head = node def pop(self): if self.empty(): raise Exception("stack is empty") val = self.head.val self.head = self.head.next return val def top(self): if self.empty(): raise Exception("stack is empty") return self.head.val def empty(self): return self.head == None ``` 3. 代码分析 上述代码实现了一个基本的链表栈,下面对代码进行分析。 链表栈的头节点为self.head,初始值为None。当调用push操作时,新建一个链表节点,将其next指向当前的头节点self.head,然后将head更新为新节点。因此,每次添加元素都是在链表头进行。 当调用pop操作时,先判断栈是否为空(即self.head是否为None),如果是则抛出异常。否则,取出头节点的val,将head更新为头节点的next,然后返回val。因此,每次删除元素也是从链表头进行。 调用top操作时,先判断栈是否为空,如果是则抛出异常。否则,直接返回头节点的val。 调用empty操作时,判断头节点是否为None即可。 4. 总结 本文介绍了如何用Python的链表来实现一个栈,以及栈的常用操作。链表栈的代码实现相较于数组栈,更加灵活和方便,尤其是在元素个数不确定的情况下,链表栈更具优势。 当然,如果需要高效地实现栈操作,可以使用Python内置的list作为栈,因为list本质上就是一个可变数组,支持快速的末尾插入和删除操作。