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本质上就是一个可变数组,支持快速的末尾插入和删除操作。