人工智能
python,大数据,机器学习,深度学习,计算机视觉
三、python算法篇(四)栈和队列
前言------ 巧记 栈和队列的区别
栈:
(1)栈,子弹,弹夹上子弹,弹夹是倒扣上的,先上的子弹后出。(栈先进后出)
(2)栈,暂,暂时存放的仓库。
队列:排队成一列,过山洞。(队列先进先出)
如下图:
栈和队列的操作 ---- 都可以用顺序表实现,也可以用链表实现。
(1)栈的操作
- stack()创建一个新的空栈
- push(item)添加一个新的元素item到栈顶(添加)
- pop()弹出栈顶元素(返回栈顶元素并删除)
- peek()返回栈顶元素(查找)
- is_empty()判断栈是否为空
- size()返回栈的元素个数
文件06_stack.py代码如下:
class Stack(object):
"""栈"""
def __init__(self):
self.__list = []
def push(self, item):
"""添加一个新的元素item到栈顶(添加)"""
self.__list.append(item)
def pop(self):
"""弹出栈顶元素(返回栈顶元素并删除)"""
return self.__list.pop()
#这里有return方便后面操作比如打印。 若在这里打印则可写print(self.__list.pop())
def peek(self):
"""返回栈顶元素(查找)"""
if self.__list: #如果不是空列表
return self.__list[-1] #返回栈顶元素也就是最后一个元素,即下标-1的元素
else: #空列表
return None
def is_empty(self):
"""判断栈是否为空"""
return self.__list == []
# 或写 return not self.__list
def size(self):
"""返回栈的元素个数"""
return len(self.__list)
#test
if __name__ == "__main__":
s = Stack() #创建对象
#添加元素到栈顶
s.push(1)
s.push(2)
s.push(3)
s.push(4)
#弹出栈顶元素,打印
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
"""
运行结果:
4
3
2
1
"""
从运行结果可以看出,栈先进后出。
(2)队列的操作
- Queue()创建一个空的队列
- enqueue(item)往队列中添加一个item元素
- dequeue()从队列头部删除一个元素
- is_empty()判断一个队列是否为空
- size()返回队列的大小
文件07_queue.py代码如下:
class Queue(object):
"""队列"""
def __init__(self):
self.__list = []
#################### 注1 start #######################################
#(1)若实际中,经常“添加”,其频率较高,则下面写法好,时间复杂度低
"""往队列中添加一个item元素"""
def enqueue(self, item):
self.__list.append(item) #尾部添加
"""从队列头部删除一个元素"""
def dequeue(self):
return self.__list.pop(0) #头部弹
#(2)若实际中,经常“弹出”,其频率较高,则下面写法好,时间复杂度低
# """往队列中添加一个item元素"""
# def enqueue(self, item):
# self.__list.insert(0, item) #头部添加
#
# """从队列头部删除一个元素"""
# def dequeue(self):
# return self.__list.pop() #尾部弹
#################### 注1 end ########################################
"""判断一个队列是否为空"""
def is_empty(self):
return self.__list == []
# return not self.__list
"""返回栈的元素个数"""
def size(self):
return len(self.__list)
#test
if __name__ == "__main__":
q = Queue() #创建对象
#队列添加元素
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
q.enqueue(4)
#队列删除元素,打印
print(q.dequeue())
print(q.dequeue())
print(q.dequeue())
print(q.dequeue())
"""
结果:
1
2
3
4
"""
从运行结果可以看出,队列先进先出。
(3)双端队列的操作
注意:如下图,双端队列若只考虑一端,则如同队列。
文件08_dqueue.py代码如下:
class Dqueue(object):
"""双端队列"""
def __init__(self):
self.__list = []
def add_front(self, item):
"""往队列中添加一个item元素"""
self.__list.insert(0, item)
def add_rear(self, item):
"""往队列中添加一个item元素"""
self.__list.append(item)
def pop_front(self):
"""从队列头部删除一个元素"""
return self.__list.pop(0)
def pop_rear(self):
"""从队列尾部删除一个元素"""
return self.__list.pop()
def is_empty(self):
"""判断一个队列是否为空"""
return self.__list == []
def size(self):
"""返回队列的大小"""
return len(self.__list)
#test
if __name__ == "__main__":
dq = Dqueue() #创建对象
#队列添加元素
dq.add_front(1)
dq.add_front(2)
dq.add_rear(3)
dq.add_rear(4)
#队列删除元素,打印
print(dq.pop_front())
print(dq.pop_front())
print(dq.pop_rear())
print(dq.pop_rear())
"""
结果:
2
1
4
3
"""