برنامه نویسی

LIFO یا FIFO؟ راهنمای پشته ها/صف ها

درک نماد Big O را فرض می کند. نمونه ها در جاوا اسکریپت هستند. منابع اطلاعاتی “شکستن مصاحبه کدگذاری” توسط گیل لااکمن مک داول

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


پشته ها: آخرین ورود، اولین خروج (LIFO)

یک پشته پنکیک را تصور کنید – آخرین پنکیکی که روی آن قرار می دهید اولین چیزی است که می خورید. این دقیقاً نحوه عملکرد یک ساختار داده پشته است. آن را دنبال می کند اصل Last In, First Out (LIFO)..

عملیات کلیدی

  • push(item): یک مورد را به بالای پشته اضافه کنید
  • pop(): آیتم بالایی را از پشته بردارید
  • peek(): مورد بالا را بدون برداشتن آن برگردانید
  • isEmpty(): بررسی کنید که آیا پشته خالی است

موارد استفاده

پشته ها به ویژه در سناریوهای زیر مفید هستند:

  • الگوریتم های بازگشتی
  • مکانیسم‌های لغو در ویرایشگرهای متن

پیاده سازی جاوا اسکریپت

OOP کلاسیک

class Stack {
  constructor() {
    this.items = [];
  }

  push(element) {
    this.items.push(element);
  }

  pop() {
    if (this.isEmpty()) {
      return "Stack is empty";
    }
    return this.items.pop();
  }

  peek() {
    if (this.isEmpty()) {
      return "Stack is empty";
    }
    return this.items[this.items.length - 1];
  }

  isEmpty() {
    return this.items.length === 0;
  }

  size() {
    return this.items.length;
  }

  clear() {
    this.items = [];
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مبتنی بر نمونه اولیه

function Stack() {
  this.items = [];
}

Stack.prototype.push = function(element) {
  this.items.push(element);
};

Stack.prototype.pop = function() {
  if (this.isEmpty()) {
    return "Stack is empty";
  }
  return this.items.pop();
};

Stack.prototype.peek = function() {
  if (this.isEmpty()) {
    return "Stack is empty";
  }
  return this.items[this.items.length - 1];
};

Stack.prototype.isEmpty = function() {
  return this.items.length === 0;
};

Stack.prototype.size = function() {
  return this.items.length;
};

Stack.prototype.clear = function() {
  this.items = [];
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


صف ها: اولین ورود، اولین خروج (FIFO)

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

عملیات کلیدی

  • enqueue(item): یک مورد را به انتهای صف اضافه کنید
  • dequeue(): اولین مورد را از صف حذف کنید
  • peek(): اولین مورد را بدون حذف آن برگردانید
  • isEmpty(): بررسی کنید که آیا صف خالی است

موارد استفاده

صف ها معمولاً در موارد زیر استفاده می شوند:

  • الگوریتم‌های جستجوی عرض اول
  • زمان بندی کار

پیاده سازی جاوا اسکریپت

OOP کلاسیک

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

class Queue {
  constructor() {
    this.start = null;
    this.end = null;
    this.size = 0;
  }

  enqueue(element) {
    const newNode = new Node(element);
    if (this.isEmpty()) {
      this.start = newNode;
      this.end = newNode;
    } else {
      this.end.next = newNode;
      this.end = newNode;
    }
    this.size++;
  }

  dequeue() {
    if (this.isEmpty()) {
      return "Queue is empty";
    }
    const removedData = this.start.data;
    this.start = this.start.next;
    this.size--;
    if (this.isEmpty()) {
      this.end = null;
    }
    return removedData;
  }

  peek() {
    if (this.isEmpty()) {
      return "Queue is empty";
    }
    return this.start.data;
  }

  isEmpty() {
    return this.size === 0;
  }

  getSize() {
    return this.size;
  }

  clear() {
    this.start = null;
    this.end = null;
    this.size = 0;
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مبتنی بر نمونه اولیه

function Node(data) {
  this.data = data;
  this.next = null;
}

function Queue() {
  this.start = null;
  this.end = null;
  this.size = 0;
}

Queue.prototype.enqueue = function(element) {
  const newNode = new Node(element);
  if (this.isEmpty()) {
    this.start = newNode;
    this.end = newNode;
  } else {
    this.end.next = newNode;
    this.end = newNode;
  }
  this.size++;
};

Queue.prototype.dequeue = function() {
  if (this.isEmpty()) {
    return "Queue is empty";
  }
  const removedData = this.start.data;
  this.start = this.start.next;
  this.size--;
  if (this.isEmpty()) {
    this.end = null;
  }
  return removedData;
};

Queue.prototype.peek = function() {
  if (this.isEmpty()) {
    return "Queue is empty";
  }
  return this.start.data;
};

Queue.prototype.isEmpty = function() {
  return this.size === 0;
};

Queue.prototype.getSize = function() {
  return this.size;
};

Queue.prototype.clear = function() {
  this.start = null;
  this.end = null;
  this.size = 0;
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


تجزیه و تحلیل عملکرد

هم پشته ها و هم صف ها ارائه می شود


O(1)O (1)

پیچیدگی زمانی برای عملیات اصلی آنها (فشار/پاپ برای پشته ها، صف بندی/تعطیل صف برای صف ها) زمانی که به طور موثر اجرا شوند. این باعث می شود آنها برای موارد استفاده خاص خود کارایی بالایی داشته باشند.

آنها هر دو راه حل های ظریفی را برای بسیاری از مشکلات برنامه نویسی رایج ارائه می دهند و اساس ساختار داده ها و الگوریتم های پیچیده تر را تشکیل می دهند. با درک و پیاده سازی این ساختارها در جاوا اسکریپت، شما به خوبی برای مقابله با طیف گسترده ای از مشکلات Leetcode/Algorithm مجهز هستید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا