zoukankan      html  css  js  c++  java
  • 队列 和 堆栈用python 来实现

    一、利用python列表实现堆栈和队列

    堆栈:

    堆栈是一个后进先出的数据结构,其工作方式就像生活中常见到的直梯,先进去的人肯定是最后出。

    我们可以设置一个类,用列表来存放栈中的元素的信息,利用列表的append()和pop()方法可以实现栈的出栈pop和入栈push的操作,list.append(obj)意思是向列表添加一个对象obj,list.pop(index=-1)意思是删除指定位置的对象,默认是最后一个对象,也就是说list.pop(),是删除列表中下标最大的元素。

    # 后进先出
    class Stack():
        def __init__(self,size):
            self.size=size
            self.stack=[]
            self.top=-1
    
        def push(self,x):  # 入栈之前检查栈是否已满
            if self.isfull():
                raise exception("stack is full")
            else:
                self.stack.append(x)
                self.top=self.top+1
    
        def pop(self):  # 出栈之前检查栈是否为空
            if self.isempty():
                raise exception("stack is empty")
            else:
                self.top=self.top-1
                self.stack.pop()
    
        def isfull(self):
            return self.top+1 == self.size
        def isempty(self):
            return self.top == '-1'
        def showStack(self):
            print(self.stack)
    
    s=Stack(10)
    for i in range(6):
        s.push(i)
    s.showStack()
    for i in range(3):
        s.pop()
    s.showStack()
    
    """
    类中有top属性,用来指示栈的存储情况,初始值为1,一旦插入一个元素,其值加1,利用top的值乐意判定栈是空还是满。
    执行时先将0,1,2,3,4,5依次入栈,然后删除栈顶的前三个元素
    """
    View Code

    基本FIFO队列

    class Queue.Queue(maxsize=0)

    FIFO即First in First Out,先进先出。Queue提供了一个基本的FIFO容器,使用方法很简单,maxsize是个整数,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。

    举个栗子:

    import Queue
    
    q = Queue.Queue()   # 建一个队列 先进先出
    
    for i in range(5):      # 放五个元素进去
        q.put(i)
    
    while not q.empty(): # 当队列不为空时,循环取值
        print q.get()

    输出:

    0
    1
    2
    3
    4

    LIFO队列

    class Queue.LifoQueue(maxsize=0)

    LIFO即Last in First Out,后进先出。与栈的类似,使用也很简单,maxsize用法同上

    再举个栗子:

    import Queue
    
    q = Queue.LifoQueue()  # 建一个后进先出的队列
    
    for i in range(5):           # 放五个值进去
        q.put(i)
    
    while not q.empty():     # 循环全部取出所有值
        print q.get() 

    输出 :

    4
    3
    2
    1
    0

    优先级队列

    class Queue.PriorityQueue(maxsize=0)

    构造一个优先队列。maxsize用法同上。

    队列:

    队列是一种先进先出的数据类型,它的跟踪原理类似于在超市收银处排队,队列里的的第一个人首先接受服务,
    新的元素通过入队的方式添加到队列的末尾,而出队就是将队列的头元素删除。
    我们可以设置一个类,用列表来存放栈中元素的信息,利用列表的append()和pop()方法可以实现队列的入队enqueue和出队dequeue的操作,
    上面栈一个元素每次出去是列表的最后一个,直接用list.pop()出栈,而出队列每次是第一个,所以要用list.pop(0)出队列
    # 先进先出
    class Queue():
    
        def __init__(self,size):
            self.size=size
            self.front=-1
            self.rear=-1
            self.queue=[]
    
        def enqueue(self,ele):  # 入队操作
            if self.isfull():
                raise exception("queue is full")
            else:
                self.queue.append(ele)
                self.rear=self.rear+1
    
        def dequeue(self):  # 出队操作
            if self.isempty():
                raise exception("queue is empty")
            else:
                self.queue.pop(0)
                self.front=self.front+1
    
        def isfull(self):
            return self.rear-self.front+1 == self.size
        def isempty(self):
            return self.front == self.rear
        def showQueue(self):
            print(self.queue)
    
    q=Queue(10)
    for i in range(6):
        q.enqueue(i)
    q.showQueue()
    for i in range(3):
        q.dequeue()
    q.showQueue()
    print(q.isempty())
    
    """
    类中设置两个属性分别为front和rear来模拟队列的头尾指针,通过它们值的关系可以判定队列是空还是满
    """
    View Code

    一些常用方法

    task_done()

    意味着之前入队的一个任务已经完成。由队列的消费者线程调用。每一个get()调用得到一个任务,接下来的task_done()调用告诉队列该任务已经处理完毕。

    如果当前一个join()正在阻塞,它将在队列中的所有任务都处理完时恢复执行(即每一个由put()调用入队的任务都有一个对应的task_done()调用)。

    join()

    阻塞调用线程,直到队列中的所有任务被处理掉。

    只要有数据被加入队列,未完成的任务数就会增加。当消费者线程调用task_done()(意味着有消费者取得任务并完成任务),未完成的任务数就会减少。当未完成的任务数降到0,join()解除阻塞。

    put(item[, block[, timeout]])

    将item放入队列中。

    1. 如果可选的参数block为True且timeout为空对象(默认的情况,阻塞调用,无超时)。
    2. 如果timeout是个正整数,阻塞调用进程最多timeout秒,如果一直无空空间可用,抛出Full异常(带超时的阻塞调用)。
    3. 如果block为False,如果有空闲空间可用将数据放入队列,否则立即抛出Full异常

    其非阻塞版本为put_nowait等同于put(item, False)

    get([block[, timeout]])

    从队列中移除并返回一个数据。block跟timeout参数同put方法

    其非阻塞方法为`get_nowait()`相当与get(False)

    empty()

    如果队列为空,返回True,反之返回False

  • 相关阅读:
    【视频+图文】带你快速掌握Java中含continue语句的双重for循环
    【小白视频学Java for循环】3分钟学会Java的for循环,让看懂for循环嵌套再不是难事
    【机器学习基础】交叉熵(cross entropy)损失函数是凸函数吗?
    【tf.keras】tensorflow datasets,tfds
    【python3基础】命令行参数及 argparse
    【机器学习实战】验证集效果比测试集好怎么办?
    [主动学习--查询策略] 01 Core-set
    Monte-Carlo Dropout,蒙特卡罗 dropout
    NumPy 会自动检测并利用 GPU 吗?
    Linux 和 Windows 查看 CUDA 和 cuDNN 版本
  • 原文地址:https://www.cnblogs.com/wzbk/p/8906644.html
Copyright © 2011-2022 走看看