栈和队列是两种基本的数据结构,同为容器类型。两者根本的区别在于:
stack:后进先出
queue:先进先出
对于stack我们可以使用python内置的list实现,因为list是属于线性数组,在末尾插入和删除一个元素所使用的时间都是O(1)。
class Stack(object):
def __init__(self):
self.stack = []
def push(self, value): # 进栈
self.stack.append(value)
def pop(self): #出栈
if self.stack:
self.stack.pop()
else:
raise LookupError('stack is empty!')
def is_empty(self): # 如果栈为空
return bool(self.stack)
def top(self):
#取出目前stack中最新的元素
return self.stack[-1]
列表实现队列:
class Queue(object):
"""队列"""
def __init__(self, maxsize=0):
"""maxsize<=0代表队列不限定大小"""
self.queue = []
self.maxsize = maxsize
def is_empty(self):
return len(self.queue) == 0
def is_full(self):
if self.maxsize <= 0:
return False
else:
return len(self.queue) == self.maxsize
def enqueue(self, item):
"""入队"""
if self.is_full():
raise Exception("Queue is full!")
else:
self.queue.append(item)
def dequeue(self):
"""出队"""
if self.is_empty():
raise IndexError("Queue is empty!")
else:
return self.queue.pop(0)
def size(self):
return len(self.queue)
def get_front(self):
"""
返回队头元素
:return:
"""
if self.is_empty():
raise IndexError("Queue is empty!")
else:
return self.queue[0]
def get_rear(self):
"""
返回队尾元素
:return:
"""
if self.is_empty():
raise IndexError("Queue is empty!")
else:
return self.queue[-1]
def print_queue(self):
return self.queue
#方法二:
class Queue:
def __init__(self):
self.items = []
def is_empty(self):
return len(self.items) == 0
def enqueue(self, item):
self.items.insert(0, item)
def dequeue(self):
return self.items.pop()
def size(self):
return len(self.items)
if __name__ == "__main__":
# 实例化对象队列
queue = Queue()
# 入队四个数
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
queue.enqueue(4)
print(queue.queue) # [1, 2, 3, 4]
print(queue.is_empty()) # False 队列不为空
print(queue.is_full()) # False 队列没有到最大元素
# 出队 先入先出 出的是1 所有剩 [2,3,4]
queue.dequeue()
print(queue.queue)
# 返回队列的元素个数 3
print(queue.size())
# 获取队列的头数据 2
print(queue.get_front())
# 获取队列的尾数据 4
print(queue.get_rear())
# 打印队列所有数据 [2,3,4]
print(queue.print_queue())
链表来实现队列数据结构:
定义一个头结点,左边指向队列的开头,右边指向队列的末尾,这样就可以保证我们插入一个元素和取出一个元素都是O(1)的操作,使用这种链表实现stack也是非常的方便。实现代码如下:
class Head(object):
def __init__(self):
self.left = None
self.right = None
class Node(object):
def __init__(self, value):
self.value = value
self.next = None
class Queue(object):
def __init__(self):
#初始化节点
self.head = Head()
def enqueue(self, value):
#插入一个元素
newnode = Node(value)
p = self.head
if p.right:
#如果head节点的右边不为None
#说明队列中已经有元素了
#就执行下列的操作
temp = p.right
p.right = newnode
temp.next = newnode
else:
#这说明队列为空,插入第一个元素
p.right = newnode
p.left = newnode
def dequeue(self):
#取出一个元素
p = self.head
if p.left and (p.left == p.right):
#说明队列中已经有元素
#但是这是最后一个元素
temp = p.left
p.left = p.right = None
return temp.value
elif p.left and (p.left != p.right):
#说明队列中有元素,而且不止一个
temp = p.left
p.left = temp.next
return temp.value
else:
#说明队列为空
#抛出查询错误
raise LookupError('queue is empty!')
def is_empty(self):
if self.head.left:
return False
else:
return True
def top(self):
#查询目前队列中最早入队的元素
if self.head.left:
return self.head.left.value
else:
raise LookupError('queue is empty!')