栈
结构: 先进后出, 后进先出,
可以想象成叠盘子
栈只有入栈出栈两个操作
下面我们来实现栈的一些操作
栈的操作
Stack() 创建一个新的空栈
push(item) 添加一个新的元素item到栈顶
pop() 弹出栈顶元素
peek() 返回栈顶元素
is_empty() 判断栈是否为空
size() 返回栈的元素个数
class Stack(object):
"""栈的实现"""
def __init__(self):
self.items = []
def is_empty(self):
"""判断栈是否为空"""
return self.items == []
def push(self, item):
"""添加一个新的元素item到栈顶"""
self.items.append(item)
def pop(self):
"""弹出栈顶元素"""
return self.items.pop()
def peek(self):
"""返回栈顶元素"""
if self.is_empty():
return None
else:
return self.items[-1]
def size(self):
"""返回栈的元素个数"""
return len(self.items)
if __name__ == '__main__':
s = Stack()
print(s.is_empty())
s.push(12)
s.push(13)
print(s.peek())
print(s.items)
# print(s.pop())
print(s.size())
栈既可以用顺序表来实现,也可以用链表来实现。用顺序表实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈
普通队列
是一种操作受限的线性表数据结构
先进先出, 后进后出 , 与排队
与栈相似
代码操作(与栈相似)
队列的实现
Queue() 创建一个空的队列
enqueue(item) 往队列中添加一个item元素
dequeue() 从队列头部删除一个元素
is_empty() 判断一个队列是否为空
size() 返回队列的大小
双端对列
就是在两端可以入队或者出队,双端队列可以在队列任意一端入队和出队
操作
Deque() 创建一个空的双端队列
add_front(item) 从队头加入一个item元素
add_rear(item) 从队尾加入一个item元素
remove_front() 从队头删除一个item元素
remove_rear() 从队尾删除一个item元素
is_empty() 判断双端队列是否为空
size() 返回队列的大小
class Team(object):
def __init__(self):
self._lists = []
def is_empty(self):
"""判断双端队列是否为空"""
return self._lists == []
def add_front(self, item):
"""从队头加入一个item元素"""
self._lists.insert(0, item)
def add_rear(self, item):
"""从队尾加入一个item元素"""
self._lists.append(item)
def remove_front(self):
"""从队头删除一个item元素"""
return self._lists.pop(0)
def remove_rear(self):
"""从队尾删除一个item元素"""
return self._lists.pop()
def size(self):
"""返回队列的大小"""
return len(self._lists)
s = Team()
print(s.is_empty())
s.add_rear(3)
print(s.size())
阻塞队列
队列为空的时候,从队头取数据会被阻塞。因为此时还没有数据可取,直到队列中有了数据才能返回;如果队列已经满了,那么插入数据的操作就会被阻塞,直到队列中有空闲位置后再插入数据,然后再返回