队列和栈

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'))
posted @ 2020-08-13 13:49  左晓龙  阅读(78)  评论(0编辑  收藏  举报