• 队列 和 堆栈用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

  • 相关阅读:
    flume sink两种类型 file_rool 自定义sing com.mycomm.MySink even if there is only one event, the event has to be sent in an array
    为什么引入进程20年后,又引入线程?
    As of Flume 1.4.0, Avro is the default RPC protocol.
    Google Protocol Buffer 的使用和原理
    Log4j 2
    统一日志 统一订单
    网站行为跟踪 Website Activity Tracking Log Aggregation 日志聚合 In comparison to log-centric systems like Scribe or Flume
    Percolator
    友盟吴磊:移动大数据平台的架构、实践与数据增值
    Twitter的RPC框架Finagle简介
  • 原文地址:https://www.cnblogs.com/wzbk/p/8906644.html
Copyright © 2020-2023  润新知