python栈与队列的封装

项目案例一:栈的封装

在这里插入图片描述

  • 栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈),允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素时称为“空栈”。向一个栈内插入元素称为是进栈,push;从一个栈删除元素称为是出栈,pop。
  • 特点 :后进先出(LIFO)。
    在这里插入图片描述
    代码:
class Stack(object):
    """栈的封装[1,2,3,4]"""

    def __init__(self):
        self.stack = []

    def push(self,value):
        """入栈"""
        self.stack.append(value)
        print(f"入栈元素是{value}")
    def pop(self):
        """出栈"""
        if self.is_empty():
            raise Exception('栈为空')
        item = self.stack.pop()
        print(f"出栈元素是{item}")
        return item
    def is_empty(self):
        """判断栈是否为空"""
        return len(self.stack) == 0
    def top(self):
        """返回栈顶元素"""
        if self.is_empty():
            raise Exception('栈为空')
        return self.stack[-1]
    def __len__(self):
        """魔术方法,len(object)自动执行的方法"""
        return len(self.stack)


if __name__ == '__main__':
    stack = Stack()
    stack.push(1)
    stack.push(2)
    stack.push(3)
    print(len(stack))
    stack.pop()
    print(stack.is_empty())
    print(stack.top())

代码运行结果:
在这里插入图片描述

项目案例: 队列的封装

  • 队列是限制在一端进行插入操作和另一端删除操作的线性表,允许进行插入操作的一端称为“队尾”,允许进行删除操作的一端称为“队头”
    ,当队列中没有元素时称为“空队”。
  • 特点 :先进先出(FIFO)。

在这里插入图片描述
在这里插入图片描述

class Queue(object):
    """队列的封装[1,2,3,4]
    1.列表的左侧为队尾
    2.列表的右侧为队头
    """
    def __init__(self):
        self.queue = []

    def enqueue(self,value):
        """入队"""
        self.queue.insert(0,value)
        print(f"入队元素是{value}")
    def dequeue(self):
        """出队"""
        if self.is_empty():
            raise Exception('队列为空')
        item = self.queue.pop()
        print("出队元素为{item}")
        return item
    def __len__(self):
        """获取队列的长度"""
        return len(self.queue)
    def first(self):
        """返回队头元素"""
        if self.is_empty():
            raise Exception('队列为空')
        return self.queue[-1]
    def is_empty(self):
        """判断栈是否为空"""
        return len(self.queue) == 0
    def last(self):
        """获取队尾元素"""
        if self.is_empty():
            raise Exception('队列为空')
        return self.queue[0]

if __name__ == '__main__':
    queue = Queue()
    queue.enqueue(1)
    queue.enqueue(2)
    queue.enqueue(3)
    print(queue.is_empty())
    queue.dequeue()
    print(queue.first())
    print(queue.last())

代码运行结果:
在这里插入图片描述

项目案例:二叉树的封装

参考博客: 二叉树封装

二叉树是树的特殊一种,具有如下特点:1、每个结点最多有两颗子树,结点的度最大为2。2、左子树和右子树是有顺序的,次序不能颠倒。3、即使某结点只有一个子树,也要区分左右子树。
在这里插入图片描述

"""
二叉树:
"""

class Node(object):
    """节点类"""
    def __init__(self, val=None, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class BinaryTree(object):
    """封装二叉树"""
    def __init__(self, root):
        self.root = root

    def pre_travel(self, root):
        """先序遍历: 根左右"""
        if (root != None):
            print(root.val)
            self.pre_travel(root.left)
            self.pre_travel(root.right)
    def in_travel(self, root):
        """中序遍历: 左根右"""
        if (root != None):
            self.in_travel(root.left)
            print(root.val)
            self.in_travel(root.right)

    def last_travel(self, root):
        """后序遍历: 左右根"""
        if (root != None):
            self.last_travel(root.left)
            self.last_travel(root.right)
            print(root.val)
if __name__ == '__main__':
    node1 = Node(1)
    node2 = Node(2)
    node3 = Node(3)
    node4 = Node(4)
    node5 = Node(5)
    node6 = Node(6)
    node7 = Node(7)
    node8 = Node(8)
    node9 = Node(9)
    node10 = Node(10)

    bt = BinaryTree(root=node1)
    node1.left = node2
    node1.right = node3
    node2.left = node4
    node2.right= node5
    node3.left = node6
    node3.right = node7
    node4.left = node8
    node4.right = node9
    node5.left = node10
    # 先序遍历
    bt.pre_travel(node1)

遍历结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中,我们通常使用消息中间件来实现任务队列。常见的消息中间件有 RabbitMQ、Redis 和 Kafka 等。这些消息中间件可以帮助我们实现任务队列,将任务加入队列并按照先进先出的顺序进行处理。 使用 RabbitMQ 实现任务队列的示例代码如下: ``` python import pika # 连接 RabbitMQ connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 创建队列 channel.queue_declare(queue='task_queue', durable=True) # 发送任务 def send_task(task): channel.basic_publish(exchange='', routing_key='task_queue', body=task, properties=pika.BasicProperties( delivery_mode=2, # 使任务持久化 )) # 处理任务 def process_task(ch, method, properties, body): print("Received %r" % body) # 执行任务 # ... # 执行完毕后发送确认消息 ch.basic_ack(delivery_tag=method.delivery_tag) # 每个消费者同时只能处理一个任务 channel.basic_qos(prefetch_count=1) # 注册消费者 channel.basic_consume(queue='task_queue', on_message_callback=process_task) # 启动消费者 channel.start_consuming() ``` 以上代码中,我们使用 RabbitMQ 的 Python 客户端 pika 连接 RabbitMQ 并创建了队列。send_task() 函数用于向队列中发送任务,process_task() 函数用于处理任务。我们使用 channel.basic_publish() 发送任务,使用 channel.basic_consume() 注册消费者并启动消费者。 在实际使用中,我们可以将 send_task() 函数封装成一个任务队列的 API,供其他模块调用。同时,我们可以为每个任务设置超时时间,以便在任务长时间未完成时可以进行超时处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值