关于栈和队列的链式存储

栈的链式存储模型

栈模型的特性:先进入的元素后出
当我们使用链式存储对链表进栈出栈的操作时,我们的表头head会随之发生移动。下面我们可以通过代码演示:

栈的链式存储代码演示:

实现功能:进栈,出栈,判断栈空,查看栈顶元素

"""
创建链式栈
思路:
    1、通过节点存储数据,达到链式存储的目的
    2、封装方法,实现栈的基本操作(入栈,出栈,栈空,查看栈顶)
    3、top为栈顶,在链表的头作为栈顶位置(不需要遍历)
"""


# 创建节点类
class Node:
    def __init__(self, val, next=None):
        self.val = val
        self.next = next


class StackError(Exception):
    pass


# 链式栈模型
class LStack:
    def __init__(self):
        self.__top = None

    def is_empty(self):
        return self.__top is None

    # 入栈 注意:创建节点后,入栈,栈顶往前移
    def push(self, val):
        node = Node(val)
        node.next = self.__top
        self.__top = node
        # self.__top = Node(val,self.__top)

    # 出栈
    def pop(self):
        if self.is_empty():
            raise StackError("pop from empty stack")
        result = self.__top.val
        self.__top = self.__top.next #元素出栈后,栈顶往后移
        return result

    # 查看栈内元素
    def top(self):
        if self.is_empty():
            raise StackError("pop from empty stack")
        return self.__top.val


if __name__ == "__main__":
    ls = LStack()
    ls.push(10)
    ls.push(15)
    ls.push(20)
    ls.push(25)
    print(ls.pop())
    print(ls.pop())

在入栈时,创建节点,节点与栈顶元素建立链接,栈顶移动至节点
node = Node(value) # 创建节点
node.next = self.top # 节点与栈顶元素建立链接
self.top = node # 栈顶移动至入栈元素

在出栈时,元素出栈,返回出栈元素的值,栈顶往栈底移动

当栈内没有任何元素,self.top = None,则判断栈为空。

队列的链式存储

特点:先进入队列的元素,先出
能够对链式队列进行操作的地方有两个,队头,队尾。
如何判断队列为空队列,我们可以创建队头,队尾的节点,当队头,队尾指向同一元素的时候,我们判断队列为空。

链式队列的代码演示:

"""
链式队列
思路:
    1、基于链表构建队列模型
    2、链表的开端作为队头,结尾作为队尾
    3、采用双标记,队头、队尾分别添加标记,
        避免每次插入数据都遍历链表
    4、队头队尾重叠时,队列为空。
"""


# 创建节点类
class Node:
    """
    自定义类视为节点类,属性作为数据内容
    写一个next属性,用来和下一个节点创建联系
    """

    def __init__(self, val, next=None):
        """
        :param val:必要数据
        :param next:下个节点的引用
        """
        self.val = val
        self.next = next


class QueueError(Exception):
    pass


class LQueue:
    def __init__(self):
        self.front = self.rear = Node(None)

    def is_empyt(self):
        return self.front == self.rear

    def enqueue(self, value): # 入队时,我们只对队尾进行操作,每入队一个元素,队尾往后移
        node = Node(value)
        self.rear.next = node
        self.rear = self.rear.next

    def dequeue(self):
        if self.is_empyt():
            raise QueueError("Queue is empty")
        # front移动到的节点已经出队
        self.front = self.front.next
        return self.front.val


if __name__ == "__main__":
    lq = LQueue()
    lq.enqueue(10)
    lq.enqueue(15)
    lq.enqueue(20)
    lq.enqueue(25)
    print(lq.dequeue())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值