队列和栈
1.栈
1.1特性:先进后出
class Stack():
def __init__(self):
#使用列表充当栈这个数据结构的容器
self.items = []
def push(self,item): #一定是从栈顶向栈底添加元素
self.items.append(item)
def pop(self):#一定是从栈顶向栈底取元素
return self.items.pop()
def isEmpty(self):
return self.items == []
def size(self):
return len(self.items)
def peek(self):#返回栈顶元素下标
return len(self.items)-1
2.队列
2.1特性:先进先出
class Queue():#从队尾入队列,从队的头部出队列
def __init__(self):
self.items = []
def enqueue(self,item): # 入列
self.items.insert(0,item)
def dequeue(self): # 出列
return self.items.pop()
def size(self): # 列的长度
return len(self.items)
def isEmpty(self): # 列是否为空
return self.items == []
2.2案例一 烫手的山芋
烫手山芋游戏介绍:6个孩子围城一个圈,排列顺序孩子们自己指定。第一个孩子手里有一个烫手的山芋,需要在计时器计时1秒后将山芋传递给下一个孩子,依次类推。规则是,在计时器每计时7秒时,手里有山芋的孩子退出游戏。该游戏直到剩下一个孩子时结束,最后剩下的孩子获胜。请使用队列实现该游戏策略,排在第几个位置最终会获胜。
kids = ['A','B','C','D','E','F']
q = Queue()
#将6个孩子加入到了队列中
for kid in kids:
q.enqueue(kid)
while q.size() > 1:
#一轮游戏山芋被传递6次,下属循环是用来控制山芋被传递的次数
for i in range(6):
#队列的特性:每次只可以将对头位置的元素删除
#规则:保证手里有山芋的孩子永远在对头的位置(每过1s让对头孩子出队列在入队列)
kid = q.dequeue()
q.enqueue(kid)
q.dequeue() #淘汰一个孩子
print('获胜者:',q.dequeue())
2.3案例二 两个队列实现栈
q1 = Queue()
q2 = Queue()
items = [1,2,3,4,5]
for item in items:
q1.enqueue(item)
while q1.size() >= 1:
while q1.size() > 1:
q2.enqueue(q1.dequeue())
print(q1.dequeue())
q1,q2 = q2,q1
from queue import Queue
class Stack():
def __init__(self):
self.master_queue = Queue()
self.minor_queue = Queue()
# 入栈
def push(self,val):
self.master_queue.put(val)
# 出栈
def pop(self):
# qsize() 队列长度为0等于没数据返回None
if self.master_queue.qsize() == 0:
return None
while True:
if self.master_queue.qsize() == 1:
# 拿出队列里面最后一个元素
value = self.master_queue.get()
break
# 把临时获取的值存在辅队列里
self.minor_queue.put(self.master_queue.get())
# 重置主队列,把辅队列临时存储的值放回去
self.master_queue, self.minor_queue = self.minor_queue , self.master_queue
return value
3.双端队列
3.1特性:同同列相比,有两个头部和尾部。可以在双端进行数据的插入和删除,提供了单数据结构中栈和队列的特性
class Dequeue():
def __init__(self):
self.items = []
def addFont(self,item):
self.items.append(item)
def addRear(self,item):
self.items.insert(0,item)
def removeFont(self):
return self.items.pop()
def removeRear(self):
return self.items.pop(0)
def isEmpty(self):
return self.items == []
def size(self):
return len(self.items)
3.2应用案例-回文检查
#回文是一个字符串,读取首尾相同的字符,例如,radar toot madam。
def isHuiWen(aString):
de = Dequeue()
for ch in aString:
de.addFont(ch)
ex = True
while de.size()>1:
if de.removeFont() != de.removeRear():
ex = False
return ex
print(isHuiWen('abaa'))