Linear Queue是指一种基于先进先出(FIFO)原则的资料结构。如同一列在银行排队的方式,最先进入排队的人最先被处理,后进入排队的人就要等候前面的人处理完毕以后才能进行下一步操作。
在Linear Queue中,资料是线性排列的,并且在做入队(Enqueue)和出队(Dequeue)操作时,资料只能在头尾两端进行。一般来说,Linear Queue是用Array或Linked List实现的。
以下是Linear Queue的范例:
当一列人在银行排队时,最先进入排队的人(ID: 001),会成为第一个进入Queue的元素。之后,第二个人(ID: 002)进入排队,成为Enqueue的元素。当第一个人(ID: 001)完成作业后,他成为Dequeue的元素,并且由第二个人(ID: 002)取代成为Head元素。
就像这个例子,当资料依照顺序进入Queue后,会依照先进先出的原则完成操作。所有在Queue中等候的元素会在适当时间被处理完毕。
答案:
class Queue:
def __init__(self, capacity):
self.items = [None] * capacity
self.capacity = capacity
self.head = 0
self.tail = -1
self.size = 0
def enqueue(self, item):
if self.is_full():
raise Exception("Queue is full")
self.tail += 1
self.items[self.tail % self.capacity] = item
self.size += 1
def dequeue(self):
if self.is_empty():
return None
item = self.items[self.head % self.capacity]
self.items[self.head % self.capacity] = None
self.head += 1
self.size -= 1
return item
def is_empty(self):
return self.size == 0
def is_full(self):
return self.size == self.capacity
答案:
class Stack:
def __init__(self, capacity):
self.queue = Queue(capacity)
self.capacity = capacity
def push(self, item):
if self.queue.is_full():
raise Exception("Stack is full")
self.queue.enqueue(item)
def pop(self):
if self.queue.is_empty():
return None
for i in range(self.queue.size - 1):
self.queue.enqueue(self.queue.dequeue())
return self.queue.dequeue()
def is_empty(self):
return self.queue.is_empty()
答案:
class Queue:
def __init__(self):
self.items = []
def insert(self, item, index):
self.items.insert(index, item)
def delete(self, index):
if index < 0 or index >= len(self.items):
return None
return self.items.pop(index)
def is_empty(self):
return len(self.items) == 0
答案:
class Queue:
def __init__(self):
self.items = []
def reverse(self):
self.items.reverse()
def enqueue(self, item):
self.items.append(item)
def dequeue(self):
if not self.items:
return None
return self.items.pop(0)
def is_empty(self):
return len(self.items) == 0
答案:
class Queue:
def __init__(self, items):
self.items = items
def reverse_k_subqueues(self, k):
for i in range(0, len(self.items), k):
self.items[i:i+k] = self.items[i:i+k][::-1]
def is_empty(self):
return len(self.items) == 0
q = Queue([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
q.reverse_k_subqueues(3)
print(q.items) # [3, 2, 1, 6, 5, 4, 9, 8, 7, 10]