python实现队列(Queue)
设定队列的队尾在列表的0位置,我们可以使用insert函数向队列的队尾插入新添加的元素,而pop则可以用来移除队首的元素(也就是列表的最后一个元素)也意味着enqueue的复杂度为O(n),而dequeue的复杂度是O(1)
class Queue:
def __init__(self):
self.items = []
def isEmpty(self):
return 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)
q = Queue()
q.enqueue(4)
q.enqueue("dog")
q.enqueue(True)
print(q.size())
print(q.isEmpty())
print(q.items)
q.dequeue()
print(q.items)
一个用队列简单解决的热土豆问题
热土豆问题 有一个热土豆在几名同学手中传递,当传过num次数后,热土豆在谁手里就退出游戏,循环传递 直到剩下最后一个就是赢家
from pythonds.basic.queue import Queue
def hotpototo(namelist,num):
simpq = Queue()
for name in namelist:
simpq.enqueue(name)
while simpq.size() > 1:
for i in range (num):
simpq.enqueue(simpq.dequeue())
simpq.dequeue()
return simpq.dequeue()
print(hotpototo(["sun","y","j","z","M","q"],7))
双端队列
与队列类似,也是一系列元素的有序组合,其两端称为队首(front)和队尾(rear),元素可以从两端删除,也可以从两端插入,这种混合的线性结构拥有栈和队列的所有功能,但其中数据项不满足“FIFO”或者“LIFO”顺序,插入和删除顺序需要用户自己来维护
使用代码实现双端队列
class Dequeue:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def addFront(self,item):
return self.items.append(item)
def RemoveFront(self):
return self.items.pop()
def addRear(self,item):
return self.items.insert(0,item)
def RemoveRear(self):
return self.items.pop(0)
def size(self):
return len(self.items)
dq = Dequeue()
print(dq.isEmpty())
dq.addFront("boy")
dq.addFront("yeare")
dq.addFront("hello")
print(dq.items)
dq.addRear("dh")
print(dq.items)
dq.RemoveFront()
print(dq.items)
print(dq.size())
用双端队列解决的回文词问题
回文词是指正读和反读都一样的单词,如:radar,toot和madam。
解决方案:采用一个双端队列来存储这个字符串,利用双端队列的对称性 从首端取字符和从尾端取字符来进行比较 设置一个标记来判断是否继续进行比较
from pythonds.basic.deque import Deque
def wordcheck(word):
checkQ = Deque()
for i in word:
checkQ.addFront(i)
sign = True
while checkQ.size()>1 and sign:
first = checkQ.removeFront()
last = checkQ.removeRear()
if first!= last:
sign = False
return sign
print(wordcheck("qeqddadadaddedeffrgsdvv"))
print(wordcheck("daad"))
列表LIST
列表是一些元素的集合,每个元素拥有一个与其他元素不同的相对位置,这种类型的列表称为一个无序列表
采用链表实现无序列表
该列表的第一项位置必须被明确指出,从外部指向的第一项被称为链表的头 ,同样的链表的最后一项需要告诉我们有没有下一个项目
类:节点NODE
用链表实现的基本模块是节点,每个节点对象必须持有至少两条信息。首先节点必须包含列表元素本身,我们将这称为该节点的“数据区”。此外,每个节点必须保持到下一个节点的引用,节点类还包括访问和修改的常用方法,返回节点数据和引用到下一项。以下是节点类的简单实现代码
class Node:
def __init__(self,initdata):
self.data = initdata
self.next = None
def getData(self):
return self.data
def getNext(self):
return self.next
def setData(self,newdata):
self.data = newdata
def setNext(self,newnext):
self.next = newnext
node1 = Node(12)
node1.setData(18)
node2 = Node(13)
node2.setData(56)
node1.setNext(node2)
print(node1.data)
print(node1.next.data)
python的特殊值None在节点类和之后的链表类发挥重要作用,引用None意味着没有下一个节点
类 无序列表 UNORDERED LIST
无序列表将由一个节点集合组成,每一个节点采用显式引用连接到下一个节点,只要我们知道第一个节点的位置,那么之后的元素都可以通过连接找到下一个节点
无序列表这个类必须保持对第一个节点的引用
class UnorderedList:
def __init__(self):
self.head = None
#期初建立链表没有一个元素
def isEmpty(self):
return self.head == []
def add(self,item):
temp = Node(item)
temp.setNext(self.head)
self.head = temp
def size(self):
current = self.head
count = 0
while current != None:#遍历操作
count = count + 1
current = current.getNext()
return count
def search(self, item):
current = self.head
found = False
while current !=None and not found:
if current.getData() == item:
found = True
else:
current = current.getNext()
return found
def Remove(self,item):
current = self.head
previous = None
found = False
while not found:
if current.getData() == item:
found = True
else:
previous = current
current = current.getNext()
if previous ==None:
self.head = current.getNext()
else:
previous.setNext(current.getNext())
mylist = UnorderedList()
mylist.add(12)
mylist.add("boy")
mylist.add(25)
mylist.add(69)
mylist.add(True)
print(mylist.size())
mylist.search(25)
print(mylist.search('boy'))
print(mylist.search(55))
print(mylist.Remove(25))
print(mylist.size())
实现size方法时,需要遍历整个链表,首先引入一个计数的,初始值为0,根据当前值是否为None来判断是否到链表的尾端,循换结束后返回了计数值
实现search方法时,使用found来判断我们是否找寻到我们需要的元素,如果未找到继续检查下一个节点,如果找到设置found为True
Remove方法 主要考虑如果previous没有移动而found已经为真,即列表的第一个节点就为我们要移除的,直接将head指向下一个,完成移除
抽象数据类型: 有序列表
按节点数据的大小来排列的
class Node:
def __init__(self,initdata):
self.data = initdata
self.next = None
def getData(self):
return self.data
def getNext(self):
return self.next
def setData(self,newdata):
self.data = newdata
def setNext(self,newnext):
self.next = newnext
class OrderedList:
def __init__(self):
self.head = None
def isEmpty(self):
return self.head == []
def size(self):
count = 0
current = self.head
while current!= None:
current = current.getNext()
count = count +1
return count
def add(self,item):
current = self.head
previous = None
stop = False
while current!= None and not stop:
if current.getData() >item:
stop = True
else:
previous = current
current = current.getNext()
temp = Node(item)
if previous == None:
temp.setNext(self.head)
self.head = temp
else:
temp.setNext(current)
previous.setNext(temp)
def remove(self,item):
current = self.head
previous = None
found = False
while not found:
if current.getData() == item:
found = True
else:
previous = current
current = current.getNext()
if previous == None:
self.head = current.getNext()
else:
previous.setNext(current.getNext())
def search(self,item):
current = self.head
found = False
stop = False
while current!=None and not found and not stop:
if current.getData() ==item:
found = True
else:
if current.getData() >item:
stop = True
else:
current = current.getNext()
return found
orl = OrderedList()
orl.add(1)
orl.add(10)
orl.add(8)
print(orl.isEmpty())
print(orl.search(8))
orl.add(0)