队列的数据结构模型:
队列是一种有次序的数据项集合, 在队列中, 数据项的添加总发生在一端(通常称为“尾端”rear),现存数据项的移除总发生在另一端(通常称为“首端”front)
“先进先出FIFO”。
使用Python实现ADT Queue:
选用最常用的数据集list来实现,选用list的首端(index=0)作为队列首端,list的尾端(index=-1)作为队列尾端。
class queue:
def __init__(self):
self.items = []
def enqueue(self, item):
self.items.append(item)
def dequeue(self):
return self.items.pop(0)
def isEmpty(self):
return self.items == []
def size(self):
return len(self.items)
队列的应用:
- 热土豆问题
from Queuetest import QueueModel
def hotPotato(nameList ,num):
nameQueue = QueueModel.queue()
for name in nameList:
nameQueue.enqueue(name)
while nameQueue.size() > 1:
for i in range(num - 1):
targetName = nameQueue.dequeue()
nameQueue.enqueue(targetName)
nameQueue.dequeue()
return nameQueue.dequeue()
print(hotPotato(["A","B","C","D","E","F"],7))
双端队列的数据结构模型:
双端队列并不具有内在的LIFO或者FIFO特性
如果用双端队列来模拟栈或者队列,需要由使用者自行维护操作的一致性
使用Python实现ADT Deque:
class Deque:
def __init__(self):
self.items = []
def is_empty(self):
return self.items == []
def add_front(self, item):
self.items.insert(0, item)
def add_rear(self, item):
self.items.append(item)
def remove_front(self):
return self.items.pop(0)
def remove_rear(self):
return self.items.pop()
def size(self):
return len(self.items)
双端队列的应用:
- 回文词判定
from queue_test import deque_model
def pal_checker(input_str):
char_deque = deque_model.Deque()
for char in input_str:
char_deque.add_rear(char)
match = True
while char_deque.size() > 1 and match:
front_char = char_deque.remove_front()
rear_char = char_deque.remove_rear()
if front_char != rear_char:
match = False
return match
print(pal_checker("ASD"))
print(pal_checker("ASDDSA"))
print(pal_checker("ASDEDSA"))