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

پشته یک نوع ساختمان داده است که با اصول LIFO کار میکند؛ مفهوم LIFO یعنی هر عنصری وارد میشود به عنوان اولین خروجی از همان ساختار انتخاب میشود.
صف در ساختمان دادهها چیست؟

صف نوع دیگری از ساختمان دادهها است که با ساختار FIFO کار میکند یعنی عناصر به همان ترتیب که وارد صف میشوند به همان ترتیب خارج میشوند.
کد صف در سی شارپ
قطعه کد زیر به عنوان یک قطعه کد که صف را در سی شارپ پیاده سازی میکند است:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WpfApplication1.myClass
{
public class queue
{
public int rear=0;
public int front=0;
public int[] arr = new int[9];
int isfull()
{
if (front == (rear + 1) % 9)
return 1;
return 0;
}
int isEmpty()
{
if (front == rear)
return 1;
return 0;
}
public int read()
{
if (isEmpty() != 1)
{
if(front == 9 && rear == 0)
return 0;
front++;
int result = arr[front - 1];
arr[front - 1] = 0;
return result;
}
return 0;
}
public void add(int a)
{
if (isfull() != 1)
{
arr[rear] = a;
if (rear == 9)
rear = 0;
else
rear++;
}
}
}
}
کد پشته در سی شارپ
قطعه کد زیر به عنوان یک قطعه کد که پشته را در سی شارپ پیاده سازی میکند است:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace stackApp
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
int[] arr = new int[99];
int tos = 99;
bool isfull()
{
if(0 <= tos && tos < arr.Length)
return true;
else
return false;
}
bool isempty()
{
if (99 >= tos && tos > arr.Length)
return false;
else
return true;
}
void push(int tos)
{
if (isfull() == false)
{
arr[tos] = 5;
tos--;
}
}
int pops(){
if (isempty() == false)
{
return arr[tos];
tos++;
}
return 0;
}
}
}
پیشنهاد نویسنده: پیاده سازی پشته در PHP
در صورتی که علاقه به یادگیری بیشتر ساختمان داده دارید کتاب ساختمان داده را دانلود کنید. اگر مشکلی در کدهای بالا احساس کردید در بخش نظرات همین نوشته به ما اطلاع دهید.



















آیا این کد با نسخههای جدید .NET 7 یا .NET 8 هم بدون تغییر اجرا میشه؟
کدهای ارائه شده برای پیادهسازی صف و پشته با استفاده از آرایهها هستند و اصولاً باید با نسخههای جدید .NET نیز سازگار باشند، اما برای اطمینان بیشتر و استفاده از قابلیتهای مدرنتر، بهتر است از کلاسهای آماده Queue و Stack در .NET استفاده کنید.
استفاده از LinkedList برای پیادهسازی صف بهتره یا استفاده از آرایههایی که توی کد هست؟
استفاده از LinkedList برای صف انعطافپذیری بیشتری دارد و مدیریت حافظه آن در صورت تغییر اندازه صف بهتر است. اما در مواردی که اندازه صف ثابت است و عملکرد اولویت دارد، آرایهها میتوانند گزینه مناسبی باشند.
این پیادهسازی برای آرایههای خیلی بزرگ هم بدون مشکل کار میکنه؟
این پیادهسازیها برای آرایههای با اندازه ثابت طراحی شدهاند و ممکن است برای آرایههای بسیار بزرگ با چالشهایی روبرو شوند. برای مدیریت بهتر آرایههای بزرگ، استفاده از ساختارهای داده پویا مانند `List` در سیشارپ توصیه میشود.
آیا میشه این کدها رو به صورت Generic بازنویسی کرد؟
بله، حتماً. با استفاده از Generics در سی شارپ میتوانید این کدها را به گونهای بازنویسی کنید که با انواع دادههای مختلف کار کنند.
در چه شرایطی استفاده از Stack بهتره و چه زمانی Queue کارایی بیشتری داره؟
انتخاب بین پشته و صف بستگی به نوع عملیات و ترتیبی دارد که دادهها باید پردازش شوند. پشته برای مواردی که آخرین ورودی باید اولین خروجی باشد (مانند فراخوانی توابع) و صف برای مواردی که اولین ورودی باید اولین خروجی باشد (مانند مدیریت درخواستها) مناسبتر است.
در پیادهسازی پشته، آیا متد isempty() بهدرستی نوشته شده است؟
با تشکر از شما، بله، در کد پشته متد `isempty()` به درستی پیادهسازی نشده است و نیاز به بازبینی دارد. بررسی دقیقتر کد میتواند به رفع این مشکل کمک کند.
چطور میشه خطای “پشته پر” یا “صف خالی” رو مدیریت کرد؟
با سلام. برای مدیریت خطاهای “پشته پر” و “صف خالی”، میتوانید در کدهای خود شرطهایی برای بررسی پر بودن پشته یا خالی بودن صف قرار دهید و در صورت بروز این شرایط، پیغام مناسبی به کاربر نمایش دهید یا عملیات مورد نظر را متوقف کنید.
چرا در کد پشته مقدار اولیهی tos روی ۹۹ تنظیم شده؟
سلام، مقدار اولیه tos روی 99 تنظیم شده چون در این کد، پشته از انتهای آرایه شروع به پر شدن میکند و tos نشاندهنده اندیس بالای پشته است. به این ترتیب، با کاهش tos، عناصر به پشته اضافه میشوند.
آیا این صف بهصورت دایرهای (Circular Queue) پیادهسازی شده است؟
بله، پیادهسازی صف در کد ارائه شده، یک صف دایرهای است که برای مدیریت فضای حافظه بهینه شده است.
در پیادهسازی صف، چرا از آرایه با اندازه ثابت استفاده شده و نه ساختار داینامیک مثل List؟
با سلام. استفاده از آرایه ثابت در این مثال سادهسازی شده است. در پیادهسازیهای واقعی، برای انعطافپذیری بیشتر، معمولاً از لیستهای پویا یا ساختارهای مشابه استفاده میشود تا اندازه صف به صورت پویا تغییر کند.