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]