صف حلقوی
صفی روی یک آرایهی با اندازهی ثابت که وقتی به انتهای آرایه رسید، از ابتدا ادامه میدهد؛ هر درج و حذف O(1) است و جای خالی هدر نمیرود.
صف با آرایهی ساده مشکلی دارد: با هر حذف از سر صف، جای خالیای در ابتدای آرایه میماند. در صف حلقوی آرایه را مثل حلقه در نظر میگیریم: بعد از آخرین خانه، اولین خانه میآید. پس:
ادامهی توضیح ↓- زمان:
O(1) per operation - حافظه:
O(capacity) - هوروویتز–ساهنی، فصل ۳
- CLRS، بخش ۱۰.۱
عددهای مثبت ENQUEUE و ۰ یعنی DEQUEUE؛ بعد از چند درج و حذف، rear از خانهی ۴ به خانهی ۰ دور میزند.
def circular_queue(ops):# A positive number is enqueued; 0 dequeues. The queue lives in a fixed array of 5 slots.cap = 5buf = [None] * capfront = 0rear = 0size = 0out = []for op in ops:if op > 0:if size == cap:continuerear = (front + size) % capbuf[rear] = opsize = size + 1else:if size == 0:continueout.append(buf[front])buf[front] = Nonefront = (front + 1) % capsize = size - 1return out
شروع اجرا
متغیرهای محلی
نارنجی = در همین گام عوض شد
ops list
Call stack
- circular_queue()خط 1
توضیح
ایده
صف با آرایهی ساده مشکلی دارد: با هر حذف از سر صف، جای خالیای در ابتدای آرایه میماند. در صف حلقوی آرایه را مثل حلقه در نظر میگیریم: بعد از آخرین خانه، اولین خانه میآید. پس:
rear = (front + size) mod cap
front = (front + 1) mod cap (بعد از حذف)
پر یا خالی؟
اگر فقط front و rear را نگه داریم، front = rear هم میتواند یعنی پر و هم خالی. اینجا size را جدا نگه میداریم؛ کتاب هوروویتز یک خانه را همیشه خالی میگذارد تا این ابهام نباشد.
ورودی
عدد مثبت یعنی ENQUEUE همان عدد و 0 یعنی DEQUEUE. ظرفیت ۵ است.