Loading

栈与队列

栈stack
  • 栈是一种容器,也称堆栈,可以存入数据元素、访问、删除元素
  • 特点在于只允许容易的一端(栈顶端指标)进行加入数据和输出
  • 没有位置概念,保证任何时候可以访问、删除的元素都会最后存入的元素,确定了一种默认的访问顺序
  • 由于栈数据结构只允许在一端操作,按照后进先出的原理运作
队列queue
  • 队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表
  • 队列是一种先进先出的线性表,简称FIFO,允许删除的一端为对头
  • 队列不允许在中间部位进行操作
  • 比如队列q=(a,b,c),a就是队头,c就是队尾,删除的时候从a开始,插入的时候在c的后面
栈结构的实现
栈可以用顺序表实现,也可以用链表实现
栈的操作
  • Stack() 创建一个新的空栈,
  • push(item) 添加一个新的元素item到栈顶
  • pop() 弹出栈顶元素
  • peek() 返回栈顶元素
  • is_empty() 判断栈是否为空
  • size() 返回栈的元素个数
  • 代码结构
class Stack:
    """栈"""

    def __init__(self):
        # 栈容器
        self.__stack_list = []

    # 添加元素到栈顶
    def push(self, item):
        '''
        @param item: 要添加的元素
        @return:
        '''
        self.__stack_list.append(item)

    # 弹出栈顶元素
    def pop(self):
        return self.__stack_list.pop()

    # 返回栈顶元素
    def peek(self):
        return self.__stack_list[-1] if self.__stack_list else None

    # 判断栈是否为空
    def is_empty(self):
        return self.__stack_list == []

    # 返回栈的元素个数
    def size(self):
        return len(self.__stack_list)

队列结构的实现
同栈一样,队列也可以用顺序表或者链表实现
队列的操作
  • Queue() 创建一个空的队列
  • enqueue(item) 往队列中添加一个item元素
  • dequeue() 从队列头部删除一个元素
  • is_empty() 判断一个队列是否为空
  • size() 返回队列的大小
    -代码结构

class Queue:
   """队列"""

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

   # 从队列尾部添加元素
   def enqueue(self, item):
       self.__queue_list.append(item)

   # 从队列头部删除一个元素
   def dequeue(self):
       return self.__queue_list.pop(0)

   # 判断队列是否为空
   def is_empty(self):
       return self.__queue_list == []

   # 返回队列的元素个数
   def size(self):
       return len(self.__queue_list)
双端队列
  • 双端队列是一种具有对列和栈的性质的数据结构
  • 双端队列中的元素可以从两端弹出
  • 其限定插入和删除操作的在表的两端进行
  • 双端队列可以在队列任意一端入队和出队
双端队列的操作
  • Deque() 创建一个空的双端队列
  • add_front(item) 从对头加入一个item元素
  • add_rear(item) 从队尾加入一个item元素
  • remove_front() 从队头删除一个item元素
  • remove_rear() 从队尾删除一个item元素
  • is_empty() 判断双端对列表是否为空
  • size() 返回队列的大小
  • 代码结构
class Dequeue:
    """双端队列"""

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

    # 从队列头部添加元素
    def add_front(self, item):
        self.__queue_list.insert(0, item)

    # 从队列尾部添加元素
    def add_rear(self, item):
        self.__queue_list.append(item)

    # 从队列头部删除元素
    def remove_front(self):
        self.__queue_list.pop(0)

    # 从队列尾部删除元素
    def remove_rear(self):
        self.__queue_list.pop()

    # 判断队列是否为空
    def is_empty(self):
        return self.__queue_list == []

    # 返回队列的元素个数
    def size(self):
        return len(self.__queue_list)
Python提供的Queue模块
Queue模块是Python内置的标准模块,实现了三种类型的队列,区别是条目取回的顺序,分别由3个类进行表示
  • Queue 先进先出队列
  • LifoQueue 后进先出队列
  • PriorityQueue优先级队列构造器,按照级别顺序取出元素,级别最低的最先取出
  • maxsize参数 设置可以放入队列中的上限,当达到的时候,插入操作将阻塞至队列中的项目被消费掉,如果maxsize 小于等于零,队列尺寸为无限大
# 导包
from queue import Queue

q = Queue(maxsize=100) # 创建一个队列对象,最大100
q.qsize()  # 返回队列的大小
q.empty()  # 如果队列为空,返回True,反之False,在线程间通信的过程中,可以通过此来给消费者等待信息
q.full()  # 如果队列满了,返回True,反之False,给生产者提醒
q.get() # 读队列,timeout等待时间
q.put() # 写队列,timeout等待时间
q.queue.clear() #清空队列
q.task_done()
'''
意味着之前入队的一个任务已经完成。由队列的消费者线程调用。每一个get()调用得到一个任务,接下来的task_done()调用告诉队列该任务已经处理完毕如果当前一个join()正在阻塞,它将在队列中的所有任务都处理完时恢复执行(即每一个由put()调用入队的任务都有一个对应的task_done()调用
'''

q.join()
'''
阻塞调用线程,直到队列中的所有任务被处理掉。只要有数据被加入队列,未完成的任务数就会增加。当消费者线程调用task_done((意味着有消费者取得任务并完成任务),未完成的任务数就会减少。当未完成的任务数降到0,join()解除阻塞
'''
posted @ 2023-03-27 11:03  木子七  阅读(36)  评论(1编辑  收藏  举报