一、Queue

queue队列也是一种常见的数据结构,具有先进先出的特性。可以理解为一个管道,从管道的一边进,另一边出。queue的实现也是常见的面试题目。我们会通过两种方式实现queue。

方式1:list实现:参考Stack实现代码,由于stack是先进后出的,queue是先进先出,因此只需要修改stack代码的出栈代码,就可以模拟实现队列:

class Queue(object):

    def __init__(self, len):
        self.data = []
        self.len = len

    def pop(self):
        return self.data.pop(0)

    def push(self, var):
        """
        :param var:
        :return:
        """
        if len(self.data) < self.len:
            self.data.append(var)
            return True
        else:
            print("Queue Full, Missing Data!")
            return False

    def peek(self):
        return self.data[0]

    def empty(self):
        return not bool(self.data)

    def full(self):
        return len(self.data) == self.len

    def find(self, var):
        """
        :param var:
        :return:
        """
        return self.data.index(var)

    def __str__(self):
        return str(self.data)

if __name__ == '__main__':
    queue = Queue(5)
    print(queue.empty())
    queue.push(1)
    queue.push(2)
    queue.push(3)
    queue.push(3)
    queue.push(4)
    queue.push(5)
    print(queue)
    print(queue.full())
    print(queue.peek())
    print(queue.find(3))
    print(queue.pop())
    print(queue.pop())
    print(queue.peek())

实际上只修改了pop,peek方法中取值的索引就可以实现队列。

方法2:通过2个栈,模拟队列

### 通过2个栈实现队列的push。pop方法
from stack import Stack
class Queue():
    def __init__(self):
        self.stack1=Stack(3)
        self.stack2=Stack(3)
        self.len=6

    def push(self,var): ## 入队列的时候,直接进入stack1
        self.stack1.push(var)

    def pop(self): ## 出队列:如果2有数据,直接pop2的数据,如果2为空,需要将1的数据全部入2,然后在pop2
        if not self.stack2.empty():
            return self.stack2.pop()
        else:
            while not self.stack1.empty():
                self.stack2.push(self.stack1.pop())
        return self.stack2.pop()