一、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()