ساختار صف حلقوی در ساختمان داده شبیه به صف خطی است. جابه‌جایی عناصر هم در این ساختار با روش «اولین ورودی، اولین خروجی» (First In First Out | FIFO) انجام می‌گیرد. تنها فرق و مهم‌ترین تفاوت صف حلقوی با صف خطی این است که آخرین خانه در این ساختمان داده به خانه اول آن متصل شده است. در نتیجه این صف شکل حلقوی پیدا می‌کند. به صف حلقوی در ساختمان داده، «بافر حلقوی» (Ring Buffer) گفته می‌شود. ساختار صف حلقوی کاربردهای متنوعی دارد که در این مطلب چند مورد از رایج‌ترین آن‌ها را معرفی کرده‌ایم. به عنوان برنامه نویس حرفه‌ای باید کار با ساختمان‌های داده مختلف را بلد باشیم. زیرا استفاده صحیح از این ابزار باعث افزایش سرعت برنامه‌ها و کاهش خطاهای احتمالی می‌شود.

فهرست مطالب این نوشته
997696

در این مطلب از مجله فرادرس با صف حلقوی در ساختمان داده آشنا شده‌ایم. ابتدا این ساختار را معرفی کرده و سپس کاربردهای رایج آن را بیان کردیم. در بخش بعد به بررسی تکنیک پیاده‌سازی عملیات ورود و حذف عنصر از صف حلقوی پرداخته‌ایم. در ادامه مطلب هم ساختمان داده صف حلقوی را با کمک زبان‌های برنامه‌ نویسی پرکاربردی مانند پایتون، جاوا و غیره پیاده‌سازی کردیم.

صف حلقوی در ساختمان داده چیست؟

صف حلقوی در ساختمان داده همان شکل و مشخصات صف خطی را دارد. از آرایه‌ها درست شده و با روش FIFO کار می‌کند. با این تفاوت که ابتدا و انتهای آن به یکدیگر متصل شده‌اند.

صف حلقوی به دلیل مشکلی که در پیاده‌سازی صف‌های معمولی وجود داشت معرفی شد. مشکل اینجا بود که اگر نشان‌گر عقب صف به خانه انتهایی آن‌ می‌رسید این احتمال وجود داشت که خانه‌های ابتدایی صف خالی و بی‌استفاده مانده باشند. با هدف حل چنین مشکلاتی صف حلقوی در ساختمان داده طراحی شد.

نمایش روش قرار گرفتن عناصر در صف حلقوی
نمایش روش قرار گرفتن عناصر در صف حلقوی

همین‌طور که در تصویر بالا دیده می‌شود، اشاره‌گر عقب به خانه آخر صف رسیده است. اشاره‌گر جلو هم به خانه‌ای غیر از خانه 0  اشاره می‌کند. در آرایه بالا تنها دو عنصر وجود دارند و باقی خانه‌های صف خالی است. اشاره‌گر عقب به موقعیت آخرین خانه صف اشاره می‌کند. بنابراین اگر بخواهیم عنصر جدیدی اضافه کنیم با پیغام نبود فضای خالی در صف روبه‌رو می‌شویم. برای جلوگیری از هدر رفتن چنین فضاهایی یک راه حل وجود دارد. آن هم این است که ابتدا هر دو عنصر را به سمت چپ در صف شیفت بدهیم. سپس باید اشاره‌گرهای جلو و عقب را هم دوباره تنظیم کنیم. این روش حل مسئله، راه حل مناسبی نیست. زیرا جابه‌جایی همه عناصر زمان زیادی صرف می‌کند. رویکرد کارآمد برای جلوگیری از هدر رفت حافظه و حل این مشکل استفاده از ساختار صف حلقوی است.

عملیات رایج بر روی صف حلقوی در ساختمان داده

در این بخش از مطلب، تمام عملیات قابل پیاده‌سازی بر روی صف حلقوی را معرفی کرده‌ایم.

  • تابع Front: این دستور برای بدست آوردن عنصر جلو در صف به کار برده می‌شود.
  • تابع Rear: این دستور برای بدست آوردن عنصر عقب در صف به کار برده می‌شود.
  • تابع enQueue(value) : این تابع برای اضافه کردن عنصر جدید به صف استفاده می‌شود. تمام عناصر جدید از انتهای عقب وارد صف می‌شوند.
  • تابع deQueue() : از این دستور با هدف حذف – واکشی – عنصر از صف استفاده می‌کنند. عملیات حذف عنصر همیشه از سمت جلوی صف انجام می‌شود. بنابراین اجرای این عملیات همیشه فضای خالی به جلو صف اضافه می‌کند.
عملیات رایج بر روی صف حلقوی در ساختمان داده
عملیات رایج بر روی صف حلقوی در ساختمان داده

کاربردهای صف حلقوی

صف حلقوی در ساختمان داده کاربردهای بسیار زیادی دارد. اما در این بخش چند مورد از رایج‌ترین کاربردهای این ساختار را معرفی کرده‌ایم.

  • مدیریت حافظه: یکی از کاربردهای صف حلقوی در بحث مدیریت حافظه است. به دلیل ساختار صف خطی و اتلاف فضا، این صف گزینه خوبی برای مدیریت حافظه نیست. اما با استفاده از ساختار صف حلقوی مدیریت حافظه عملکرد کارآمدی پیدا می‌کند. این مسئله به خاطر استفاده از تمام فضاهای خالی درون صف است.
  • زمان بندی CPU: سیستم عامل هم از ساختار صف حلقوی برای نگهداری فرایند‌هایی استفاده می‌کند که باید به ترتیب پردازش شوند.
  • سیستم مدیریت ترافیک: در سیستم مدیریت ترافیک به وسیله کامپیوتر، چراغ‌های راهنمایی و رانندگی یکی از بهترین مثال‌ها برای استفاده از صف حلقوی هستند. هر کدام از چراغ‌های راهنمایی بعد از مدت زمان مشخص شده و به ترتیب پشت سر هم یک به یک روشن و خاموش می‌شوند. چراغ‌های قرمز، سبز و زرد بعد از مدت زمان فرضی یک دقیقه و به ترتیب، روشن می‌شوند.

عملیات ورود به صف

عملیات ورود داده به صف با نظم و ترتیب مشخصی انجام می‌شود. این ترتیب را در فهرست پایین نوشته‌ایم.

  • ابتدا باید بررسی کنیم که آیا صف پر است یا خالی.
  • وقتی که صف کاملا خالی است، هر دو اشاره‌گر جلو و عقب را با مقدار -1 مقداردهی می‌کنیم. با افزوده شدن اولین عنصر به صف، مقدار 0  به هر دو اشاره‌گر جلو و عقب اختصاص داده می‌شود.
  • هر وقت که عنصر جدیدی به صف اضافه می‌شود مقدار اشاره‌گر عقب یک واحد افزایش پیدا می‌کند. یعنی اینکه rear=rear+1

توجه: اندیس‌های صف مانند باقی لیست‌ها و آرایه‌ها از صفر شروع می‌شوند. مقدار -1 در زمان خالی بودن صف، به معنای این است که هیچ عنصری وجود ندارد. بنابراین اشاره‌گرهای جلو و عقب به هیچ جا اشاره نمی‌کنند. اگر این اشاره‌گرها به مقدار 0  اشاره کنند یعنی آنکه عنصری در اولین خانه صف با اندیس 0  وجود دارد.

سناریو‌های مختلف در زمان افزودن عنصر به لیست

برای زمانی که صف هنوز پر نشده است، دو سناریو مختلف وجود دارد. در فهرست زیر عبارت «rear != max – 1» به آخرین خانه در صف اشاره می‌کند.

  1. اگر rear != max – 1: در این حالت اشاره‌گر عقب با تابع mod(maxsize) به اندازه یک واحد افزایش پیدا می‌کند. در نتیجه عنصر جدید می‌تواند به صف – خانه‌ای که اشاره‌گر عقب اکنون به آن اشاره می‌کند – افزوده شود.
  2. اگر front != 0 and rear = max – 1: این حالت به معنای آن است که صف هنوز پر نشده است. در این حالت به اشاره‌گر عقب مقدار 0  اختصاص داده می‌شود. عنصر جدید هم باید در خانه 0  قرار بگیرد.
نقطه‌های رنگی که به صورت صف‌های منظمی از ابتدا تا به انتها قرار گرفته اند.

در دو حالت، امکان افزودن عنصر جدید به صف وجود ندارد.

  1. وقتی که front ==0 و rear = max-1: این حالت به معنای آن است که اشاره‌گر جلو در خانه اول صف قرار دارد. همچنین اشاره‌گر عقبی هم به آخرین خانه از صف اشاره می‌کند.
  2. وقتی که front== rear + 1: دراین حالت اشاره‌گر عقب و اشاره‌گر جلوی صف دقیقا پشت سر هم قرار دارند.

الگوریتم افزودن عنصر به صف حلقوی در ساختمان داده

در این بخش از مطلب الگوریتم مورد استفاده برای افزودن عنصر جدید به صف حلقوی در ساختمان داده را ارائه کرده‌ایم. قبل از انجام این کار، ابتدا باید وضعیت اشاره‌گرهای جلو و عقب را بررسی کنیم.

مرحله اول بررسی پر بودن صف

در مرحله اول باید پر بودن صف را بررسی کنیم. به این منظور، وضعیت اشاره‌گرهای جلو و عقب را با کمک شرط (REAR+1)%MAX = FRONT بررسی می‌کنیم. برقرار بودن این شرط به معنای پر شدن صف است. در نتیجه امکان افزودن داده جدید وجود ندارد و باید به مرحله آخر برویم.

در کادر زیر، «شبه کد» (Pseudocode) این مرحله را نوشته‌ایم.

IF (REAR+1)%MAX = FRONT
Write " OVERFLOW "
Goto step 4
[End OF IF]

مرحله دوم بررسی خالی بودن صف

در مرحله دوم باید ببینیم که آیا صف کاملا خالی است یا نه. وقتی که صف کاملا خالی باشد، هر دو اشاره‌گر جلو و عقب دارای مقدار -1 هستند. یعنی اینکه شرط FRONT = -1  و REAR = -1  برقرار است. در این حالت عنصر افزوده شده در اولین خانه از صف قرار می‌گیرد. بعد از آن هر دو اشاره‌گر به خانه 0  اشاره می‌کنند.

حتی وقتی مقدار اشاره‌گر جلو غیر از 0  بوده و اشاره‌گر عقب هم برابر با MAX – 1  باشد باز هم عنصر جدید به خانه 0  اضافه می‌شود. در کادر زیر شبه‌کد مورد استفاده برای این مرحله را نوشته‌ایم.

IF FRONT = -1 and REAR = -1
SET FRONT = REAR = 0
ELSE IF REAR = MAX - 1 and FRONT ! = 0
SET REAR = 0
ELSE
SET REAR = (REAR + 1) % MAX
[END OF IF]

مرحله سوم برقرار نبودن هیچ کدام از شرط‌های بالا

عنصر مورد نظر را به خانه‌ای تخصیص می‌دهیم که اشاره‌گر عقبی به ان اشاره می‌کند.

SET QUEUE[REAR] = VAL

مرحله چهارم

در این مرحله اجرای کار الگوریتم به‌ پایان می‌رسد.

فیلم‌ های آموزشی درس ساختمان داده

دانش ساختمان داده جزو علوم بسیار مفید در زمان تولید نرم‌افزارهای مختلف است. الگوریتم و ساختمان داده، رابطه بسیار نزدیکی با یکدیگر دارند. این دروس تقریبا در همه زیر مجموعه‌های رشته علوم کامپیوتر در دانشگاه‌ها نیز تدریس می‌شوند. در نتیجه برای قبولی در آزمون‌های آکادمیکی مانند کنکور ارشد و دکتری نیز لازم است که در این حوزه‌ها حرفه‌‌ای باشیم. فرادرس همیشه تلاش کرده تا بهترین فیلم‌ها و مطالب آموزشی را به شکل با کیفیت و کامل در اختیار مخاطبان خود قرار دهد. تماشای فیلم‌های آموزشی فرادرس باعث کاهش هزینه‌ها و افزایش راندمان یادگیری می‌شود.

مجموعه آموزش ساختمان داده – از دروس دانشگاهی تا کاربردی
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه آموزش ساختمان داده و طراحی الگوریتم هدایت شوید.

وب‌سایت آموزشی فرادرس، درباره طراحی الگوریتم و ساختمان داده‌ها اقدام به تولید فیلم‌های مختلفی کرده است. البته تلاش اصلی فرادرس بر روی این مسئله بود که هر دو جنبه علمی و آکادمیک این مباحث در کنار یکدیگر پوشش داده شوند. در ادامه فیلم‌های آموزشی را معرفی کردیم که به درس ساختمان داده مرتبط هستند. البته توجه دقیق به این فیلم‌ها باعث کسب مهارت بیشتر در انجام پروژه‌های عملی نیز می‌شود. در صورت تمایل برای آشنا شدن با مباحث بیشتر بر روی تصویر بالا کلیک کنید.

عملیات استخراج داده از صف

در فهرست زیر تمام مراحل مربوط به «حذف داده از صف» (Dequeue) را نوشته‌ایم.

  • ابتدا بررسی می‌کنیم که آیا صف خالی است یا نه. اگر صف خالی باشد، نمی‌توان هیچ اطلاعاتی از درون آن استخراج کرد.
  • اما اگر صف خالی نبود، بعد از حذف هر عنصر، باید مقدار اشاره‌گر جلو به اندازه یک واحد کاهش پیدا کند.
  • در شرایطی که فقط یک عنصر در صف وجود دارد، بعد از استخراج آن صف خالی می‌شود. در این حالت به هر دو اشاره‌گر جلو و عقب صف، باید مقدار -1 اختصاص داده شود.

در بخش بعدی، الگوریتم پیاده‌سازی این عملیات را ارائه کرده‌ایم.

الگوریتم حذف عنصر از صف حلقوی در ساختمان داده

در این قسمت از مطلب، الگوریتم مورد استفاده برای حذف عناصر از صف را به صورت مرتب و منظم نوشته‌ایم. این الگوریتم شامل چهار مرحله است.

  • مرحله اول: اگر شرط FRONT = -1  برقرار بود. پیغام «UNDERFLOW» را در خروجی چاپ کن و سپس برو به مرحله چهارم.
  • مرحله دوم VAL = QUEUE[FRONT]: مقدار موجود در خانه‌ای را که اشاره‌گر جلو به آن اشاره می‌کند استخراج کرده و به متغیری اختصاص می‌دهیم.
  • مرحله سوم: اگر شرط FRONT = REAR  برقرار شد. مقدار هر دو اشاره‌گر جلو و عقب را برابر با -1 قرار بده.
  • در غیر این صورت اگر شرط FRONT = MAX -1  برقرار بود مقدار اشاره‌گر جلو را برابر با 0  قرار بده.
  • اگر هیچ کدام از شرط‌های بالا برقرار نبود دستور FRONT = FRONT + 1  را اجرا کن. در واقع می‌گویند که مقدار اشاره‌گر جلو را یک واحد افزایش بده.
  • مرحله چهارم: پایان کار الگوریتم

شبه‌کدهای مربوط به الگوریتم حذف عنصر از صف حلقوی را در کادر زیر نوشته‌ایم.

Step 1:
IF FRONT = -1
Write " UNDERFLOW "
Goto Step 4
[END of IF]

Step 2: 
SET VAL = QUEUE[FRONT]

Step 3:
IF FRONT = REAR
SET FRONT = REAR = -1
ELSE
IF FRONT = MAX -1
SET FRONT = 0
ELSE
SET FRONT = FRONT + 1
[END of IF]
[END OF IF]

Step 4:
EXIT

نمایش تصویری روش حذف و اضافه عنصر در صف حلقوی

در پایین تمام عملیات مربوط به ورود و خروج اطلاعات از صف حلقوی را با استفاده از نمایش تصویری توضیح داده‌ایم.

در تصویر زیر صف کاملا خالی است. بنابراین هر دو اشاره‌گر‌های جلو و عقب دارای مقدار -1 هستند.

نمایش صف خالی با اندیس‌های شماره گذاری شده - صف حلقوی در ساختمان داده
هر دو اشاره‌گر‌های جلو و عقب دارای مقدار «1-» هستند.

با ورود اولین داده به صف،‌ مقدار هر دو اشاره‌گر برابر با 0  می‌شود.

نمایش صف خطی با اندیس‌های شماره گذاری شده
مقدار هر دو اشاره‌گر برابر با «0» است.

بعد از اضافه شدن دو داده دیگر به صف مقدار اشاره‌گر عقب به اندازه 2
 واحد افزایش پیدا می‌کند

نمایش صف خطی با اندیس‌های شماره گذاری شده

بعد از اضافه شدن عنصر چهارم به صف باز هم مقدار اشاره‌گر عقب به اندازه یک واحد دیگر افزایش پیدا می‌کند.

نمایش صف خطی با اندیس‌های شماره گذاری شده

بعد از اضافه شدن عنصر پنجم به صف، باز هم مقدار اشاره‌گر عقب به اندازه یک واحد دیگر افزایش پیدا می‌کند. اکنون دیگر صف پُر شده است.

نمایش صف خطی با اندیس‌های شماره گذاری شده
اکنون دیگر صف پُر شده است.

در این مرحله دو عنصر را از جلوی صف حذف کرده‌ایم. مقدار اشاره‌گر جلو به اندازه دو واحد افزایش پیدا کرده است.

نمایش صف خطی با اندیس‌های شماره گذاری شده
همیشه صف از سمت جلو خالی می‌شود.

در این مرحله عنصر جدید به صف افزوده شده است. قابل مشاهده است که اشاره‌گر عقب به خانه صفر اشاره می‌کند. در واقع با پیروی از دستور‌العمل قرارگیری داده‌ها یک دور کامل در این صف زده‌ایم و دوباره از اول صف شروع به جای‌گذاری عناصر جدید کردیم.

نمایش صف خطی با اندیس‌های شماره گذاری شده
ورود عنصر جدید به خانه‌ خالی در ابتدای صف

در این مرحله عنصر جدیدی به صف افزوده شده است. می‌بینیم که صف پر شده اما اشاره‌گرهای جلو و عقب به ابتدا و انتهای صف اشاره نمی‌کنند.

نمایش صف خطی با اندیس‌های شماره گذاری شده

پیاده سازی صف حلقوی در ساختمان داده با استفاده از آرایه

پیاده‌سازی صف حلقوی با استفاده از آرایه، به معنی ساخت نوع خاصی از صف است. در این ساختار وقتی به انتهای صف برسیم، به‌جای متوقف شدن در آنجا، به ابتدای صف منتقل می‌شویم. در نتیجه استفاده بسیار بهینه‌تری از فضای صف می‌کنیم. تمام عناصر به صورت دایره‌وار به صف وارد شده و از آن خارج می‌شوند.

البته آرایه‌ها کاربرد‌های بسیار زیادی دارند. تقریبا بیشتر ساختمان‌های داده تعریف شده توسط کاربر بر اساس آرایه ساخته می‌شوند. بنابراین آرایه در حوزه ساختمان داده نقش مهمی بازی می‌کند. برای آشنایی بیشتر با این ساختمان داده ساده و کاربردی پیشنهاد می‌کنیم که فیلم آموزش رایگان آرایه در ساختمان داده را از فرادرس مشاهده کنید. لینک مربوط به این فیلم را در پایین نیز قرار داده‌ایم.

در ادامه روش پیاده‌سازی مرحله‌به‌مرحله صف حلقوی در ساختمان داده را با زبان‌های پایتون، جاوا، ++C و C نوشته‌ایم.

پیاده سازی صف حلقوی با زبان پایتون

ابتدا روش پیاده‌سازی صف حلقوی در ساختمان داده را با زبان برنامه نویسی پایتون نمایش داده‌ایم.

همین طور که می‌بینید، کلاسی به نام CircularQueue  برای تعریف صف حلقوی تعریف کرده‌ایم. سپس تمام عمیات قابل اجرا در این صف را به صورت توابع و ویژگی‌های درونی کلاس به آن افزوده‌ایم.

پیاده سازی صف حلقوی با زبان جاوا

در این بخش، کدهای پیاده‌سازی صف حلقوی در ساختمان داده را با زبان برنامه نویسی جاوا پیاده‌سازی کرده‌ایم.

در زبان جاوا هم از تکنیک برنامه نویسی شیءگرایانه برای تعریف صف حلقوی استفاده کردیم.

پیاده سازی صف حلقوی با زبان ++C

در این قسمت از مطلب، روش پیاده‌سازی صف حلقوی در ساختمان داده را با زبان برنامه نویسی ++C نمایش داده‌ایم.

زبان ++C هم، یکی از زبان‌های برنامه نویسی شیءگرا است. برای همین در این زبان‌ هم بهترین روش برای تعریف ساختمان داده صف حلقوی استفاده از کلاس است. البته زبان ++C ساختار و سینتکسی شبیه به زبان C دارد.

پیاده سازی صف حلقوی با زبان C

در این قسمت هم، روش پیاده‌سازی صف حلقوی در ساختمان داده را با زبان برنامه نویسی C نمایش دادیم.

زبان برنامه نویسی C از شیءگرایی پشتیبانی نمی‌کند. اما ساختاری به نام struct در زبان C وجود دارد. این ساختار تقریبا رفتاری مانند کلاس‌ها دارد. از این ساختار برای تعریف «نوع» جدید و مشتق شده از سایر انواع موجود در زبان برنامه نویسی C استفاده می‌شود. نوع جدید توسط کاربر تعریف شده و امکان سفارشی‌سازی تمام رفتار‌های و ویژگی‌های آن وجود دارد. برای آشنایی بیشتر با «struct» مطلب مربوط به آن را در مجله فرادرس مطالعه کنید.

چطور برنامه نویسی را با کمک فرادرس یادبگیریم؟

برنامه‌نویسی یکی از جذاب‌ترین حوزه‌ها در دنیای مدرن است. افراد زیادی با دلایل متنوعی مانند علاقه، سرگرمی، انتخاب شغل و غیره به یادگیری برنامه‌نویسی مشغول شده‌اند. زیرا در این زمینه محدودیت‌های جسمی، جنسیتی و سنی وجود ندارند. وب‌سایت آموزشی فرادرس با هدف یادگیری برنامه‌نویسی برای همه مخاطبان خود، فیلم‌های آموزشی متنوعی تولید کرده است. در فرادرس تلاش کردیم تقریبا همه گرایش‌ها و تکنولوژی‌های مختلف را برای کمک به علاقه‌مندان به برنامه نویسی با بهترین کیفیت ممکن پوشش دهیم. در فهرست پایین چند مورد متنوع از فیلم‌های آموزشی را معرفی کرده‌ایم. این فیلم‌ها درباره آموزش زبان‌های مختلف از سطح مبتدی هستند.

مجموعه آموزش برنامه نویسی – مقدماتی تا پیشرفته
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه فیلم‌های آموزش برنامه نویسی هدایت شوید.

در صورتی که به دنبال فیلم مربوط به سایر زبان‌های برنامه‌نویسی یا فیلم‌های سطح بالاتری از لحاظ علمی می‌گردید، با کلیک بر روی تصویر بالا می‌توانید وارد صفحه اصلی این مجموعه آموزشی شده و گزینه مورد نظر خود را پیدا کنید.

مزایای استفاده از صف حلقوی در ساختمان داده

صف حلقوی در ساختمان داده یکی از بهینه‌ترین ساختمارها برای مدیریت داده‌ها و فرایند‌هایی است که ترتیب اجرای آن‌ها اهمیت دارد.

در این بخش از مطلب مهم‌ترین مزیت‌های استفاده از این ساختار را معرفی کرده‌ایم.

  • استفاده بهینه از فضا: صف حلقوی یکی از بهینه‌ترین ساختارها در استفاده از فضا است. وقتی که آخرین خانه در این صف پر شد، اشاره‌گر عقب – البته در صورت وجود فضای خالی – به ابتدای صف باز می‌گردد. با این روش هیچ‌ فضایی هدر نمی‌رود. در صف‌های خطی بعد از حرکت کردن عناصر به سمت انتهای صف احتمال باقی ماندن فضای خالی غیرقابل استفاده در ابتدای صف وجود دارد.
  • هیچ نیازی به جابه‌جایی عناصر ندارد: در صف‌های خطی، وقتی که عنصری حذف می‌شود، تمام دیگر عناصر برای حفظ نظم صف باید به اندازه یک واحد به جلو حرکت داده شوند. اما این عملیات جابه‌جایی در صف‌های حلقوی ضروری نیست. زیرا طبیعت صف‌ حلقوی بر اساس حفظ نظم بین عناصر استوار است. در نتیجه اجرای عملیات مختلف در این صف با سرعت بیشتری هم انجام می‌شود.
  • اندازه ثابتی دارد: صف‌های حلقوی با استفاده از آرایه‌هایی با طول ثابت ایجاد می‌شوند. وجود این آرایه‌ها فرایند مدیریت حافظه‌ را ساده‌تر می‌کند. از آنجا که اندازه صف در زمان ساخت آن تعیین شده است، دیگر نیازی به سیستم «تغییر اندازه پویا» (Dynamic Resizing) و «تخصیص دوباره حافظه» (Memory Reallocation) وجود ندارد.
  • «پیچیدگی زمانی» ثابت دارد: عملیات افزودن به صف یا حذف عناصر آن در ساختارهای حلقوی همیشه پیچیدگی زمانی ثابتی دارند. مقدار این پیچیدگی برابر با O(1)O(1) است. به این معنا که زمان مورد نیاز برای اجرای این عملیات همیشه ثابت بوده و ارتباطی با تعداد عناصر موجود در صف ندارد. در نتیجه این ساختمان داده همیشه کارآمدی یکسانی داشته و به سادگی می‌توان مدت زمان اجرای عملیات مختلف را بر روی آن پیش‌بینی کرد.
  • عملکرد بهتری در زمینه مدیریت بافر‌ها دارد: از صف‌های حلقوی در سناریو‌های مربوط به بافر در برنامه نویسی استفاده می‌شود. برای مثال می‌توان به اپلیکیشن‌های مربوط به استریم یا زمان‌بندی اجرای وظایف در سیستم عامل اشاره کرد. این ساختمان داده روش بسیار مناسبی را برای مدیریت بافر‌ها فراهم کرده و از بروز مشکلاتی مانند «Overflow» و «Underflow» جلوگیری می‌کند.
  • گزینه بسیار مناسبی برای مدیریت منابع است: در زمان استفاده مکرر از منابع، به کار بردن صف حلقوی روش بسیار خوبی است. به عنوان مثال می‌‌توانیم به الگوریتم «راند رابین» (Round-Robin) برای مدیریت پردازش‌ها در سیستم عامل‌ اشاره کنیم. این روش‌، سه مزیت اصلی دارد. اول اینکه به تمام فرایندها زمان مساوی تخصیص داده می‌شود. دوم اینکه امکان تخصیص منبع به همه فرایند‌ها به صورت تکراری وجود دارد. و سوم آن که ترتیب تخصیص منابع به فرایند‌ها در این دور‌های تکراری، ثابت و منظم است.
  • روش پیاده‌سازی ساده‌ای دارد: منطق پیاده‌سازی صف حلقوی در ساختمان داده بسیار ساده است. استفاده از عملیات مربوط به «محاسبه باقی‌مانده» – با عملگر % -باعث شده که کار با اندیس‌ها ساده‌تر شده و از بروز خطاهای احتمالی هم جلوگیری می‌کند.
مزایای استفاده از صف حلقوی در ساختمان داده
مزایای استفاده از صف حلقوی در ساختمان داده

جمع‌بندی

صف‌ها یکی از ساختمان‌های داده بنیادین هستند. این ساختمان‌های داده، عناصر را با ترتیب ثابت و مشخصی نگهداری می‌کنند. صف با استفاده از الگوی FIFO یا اولین ورودی، اولین خروجی، داده‌ها را مدیریت می‌کند. مشکل اینجاست که صف‌های خطی می‌توانند حافظه را هدر بدهند. مخصوصا در زمان کار با جریان دائمی داده‌، استفاده از این ساختار مناسب نیست. صف‌های حلقوی برای حل این مشکل معرفی شده‌اند. زیرا این ساختمان داده دائما به دور خود چرخیده و از تمام فضای خالی موجود در صف استفاده می‌کند.

در این مطلب از مجله فرادرس با صف حلقوی در ساختمان داده آشنا شدیم. ابتدا بعضی از رایج‌ترین کابردهای آن را معرفی کرده و سپس روش ورود و خروج داده به آن را شرح دادیم. بعد از آن‌ هم کدهای مربوط به پیاده‌سازی صف حلقوی را در زبان‌های پایتون، جاوا، ++C و C را نشان دادیم.

source

توسط expressjs.ir