10.28Python_数据结构_栈和链表

1.概念

数据结构是计算机科学中的一个核心概念,它是指数据的组织、管理和存储方式,以及数据元素之间的关系。数据结构通常用于允许高效的数据插入、删除和搜索操作。

数据结构大致分为几大类:

线性结构:数组、链表、栈、队列等。

非线性结构:树、二叉树、堆、图等。

散列:哈希表。

索引:B树、B+树等。

2.常见数据结构

2.1 栈

栈(stack),它是一种运算受限的线性表,遵循后进先出(Last In First Out,LIFO)原则的数据结构。

  • LIFO(last in first out)表示就是后进入的元素, 第一个弹出栈空间. 类似于自动餐托盘, 最后放上的托盘, 往往先把拿出去使用.
  • 其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
  • 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;
  • 从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

栈常见的操作

  • push(element): 添加一个新元素到栈顶位置.
  • pop():移除栈顶的元素,同时返回被移除的元素。
  • peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它)。
  • isEmpty():如果栈里没有任何元素就返回true,否则返回false。
  • clear():移除栈里的所有元素。
  • size():返回栈里的元素个数。这个方法和数组的length属性很类似。

2.1.1 入栈

2.1.2 出栈

2.1.3 代码分析

  1. 使用数组来模拟栈
  2. 定义一个 空数组
  3. 入栈的操作,当有数据加入到栈时,判断数组长度是否达到阈值,是则抛栈已满的异常,否则将数据追加到数组的尾部;
  4. 出栈的操作,判断栈是否空,是则抛栈已空的异常,否则从数组尾部移除一个数据,并返回该数据;

代码实现:

python 复制代码
class Stack:
    def __init__(self, size):
        self.items = []
        self.size = size

    def isFull(self):
        return len(self.items) == self.size

    def push(self, element):
        if self.isFull():
            raise Exception('stack is full')

        self.items.append(element)

    def pop(self):
        if self.isEmpty():
            raise Exception('stack is empty')

        return self.items.pop()

    def peek(self):
        if self.isEmpty():
            raise Exception('stack is empty')
        return self.items[-1]

    def isEmpty(self):
        return len(self.items) == 0

    def clear(self):
        self.items.clear()


if __name__ == '__main__':
    stack = Stack(20)
    stack.push(1)
    stack.push(2)
    
    print(stack.peek())

2.2 链表

链表是一条相互链接的数据节点表。每个节点由两部分组成:数据和指向下一个节点的指针。

2.1 链表的优缺点

优点:

  1. 物理存储单元上非连续,而且采用动态内存分配,能够有效的分配和利用内存资源;
  2. 节点删除和插入简单,不需要内存空间的重组。

缺点:

  1. 不能进行索引访问,只能从头结点开始顺序查找;
  2. 数据结构较为复杂,需要大量的指针操作,容易出错。

2.2 单向链表

2.2.1 插入

尾部插入

从头结点开始逐个遍历链表,直到找到next=null,表示为最后一个节点,再将最后节点的next指向新增节点。

头部插入

如果头节点的next=null表示链表为空,直接将头节点的next指向新增节点

如果头节点的next!=null,表示头节点后已存在后续节点,需要将新增节点插入到头节点和后续节点中间:

1.获取头节点的后续节点,定义一个临时节点,将该节点指向临时节点

2.将头节点的next指向新增节点

3.新增节点的next指向临时节点

2.2.2 遍历

从头结点开始,通过next遍历,直到next=null

2.2.3 删除
2.2.4 代码实现
python 复制代码
class Node:
    def __init__(self, data=None):
        if data is not None:
            self.data = data
        self.next = None


class LinkedList:
    def __init__(self):
        head = Node()
        self.head = head

    def append(self, data):
        new_node = Node(data)
        # 如果链表为空,则在头部后插入
        if self.head.next is None:
            self.head.next = new_node
        else:
            node = self.head.next
            while node.next is not None:
                node = node.next
            node.next = new_node

    def prepend(self, data):
        new_node = Node(data)
        if self.head.next is None:
            self.head.next = new_node
        else:
            new_node.next = self.head.next
            self.head.next = new_node

    def remove(self, data):
        if self.head.next is None:
            raise Exception('Linked List is empty')
        node = self.head.next
        while node.data != data:
            node = node.next
        node.next = node.next.next

    def display(self):
        node = self.head.next
        while True:
            print(node.data)
            if node.next is None:
                break
            node = node.next


if __name__ == '__main__':
    list = LinkedList()
    list.append(1)
    list.append(2)
    list.prepend(3)
    list.display()
相关推荐
databook31 分钟前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar2 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户8356290780512 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_2 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机9 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机10 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机10 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机10 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i10 小时前
drf初步梳理
python·django
每日AI新事件10 小时前
python的异步函数
python