Stack Data Structure چیست؟
اول از همه، بیایید نگاهی گذرا به چیستی ساختار داده پشته بیندازیم. این یک ساختار داده خطی است که بر اساس اصل Last-in-First-out (LIFO) است. یه جورایی ضد صفه یک دسته کارت یا یک دسته کتاب را در یک جعبه تصور کنید. کتابی که ابتدا در پشته گذاشتید در پایین است، و اولین کتابی که از جعبه بیرون می آوریم، کتابی است که در بالا قرار داشت - یعنی کتابی که آخرین بار وارد جعبه شد. در اینجا یک تصویر گیف برای نشان دادن این اصل وجود دارد.
ساختار داده Stack برای چیست؟
یکی از مهم ترین کاربردهای پشته، سازماندهی تماس های زیر روال است. نقطه تماس در پشته آدرس برگشتی را از زیر روال پس از پایان آن (و احتمالاً پارامترهای ارسال شده) ذخیره می کند. با هر فراخوانی تودرتو (از جمله بازگشتی) زیر روال ها، آدرس های بازگشتی جدید به پشته اضافه می شوند. با هر عملیات بازگشت از زیر روال (بازگشت)، آدرس برگشتی از پشته حذف شده و کنترل به آن منتقل می شود. این برنامه به قدری برای برنامه نویسی مهم است که در اکثر پردازنده ها پشته بازگشتی در سخت افزار در مجموعه دستورالعمل پیاده سازی می شود. با این حال، در موارد دیگر، پشته باید بر اساس ساختارهای داده عمومی تر مدل شود.Java Stack Class of Collection Framework
در Java Stack Class یک کلاس از چارچوب مجموعه است که رابط List را پیاده سازی کرده و کلاس Vector را گسترش می دهد. همچنین اینترفیس های Collection، Iterable، Cloneable، Serializable را پیاده سازی می کند. همانطور که احتمالا قبلاً حدس زده اید این کلاس نشان دهنده پشته اشیاء LIFO است. در اینجا فراخوانی سازنده کلاس Stack است ، یعنی ایجاد یک شی از این کلاس.Stack<E> stack = new Stack<E>();
جایی که E نوع شی است.
روش های پشته جاوا
این کلاس فقط یک سازنده پیش فرض و تمام متدهای کلاس Vector دارد . به علاوه، Stack 5 روش خاص خود را دارد:-
متد خالی () boolean چک می کند که آیا پشته خالی است یا نه. اگر پشته خالی باشد true ، در غیر این صورت false برمی گرداند .
-
شیء peek() متد عنصری را که در بالای پشته قرار دارد برمی گرداند.
-
شیء pop() متد عنصری را که در بالای پشته قرار دارد برمی گرداند و آن را حذف می کند.
-
Object push (Object element) روش عنصر مشخص شده را به بالای پشته اضافه می کند.
-
int search (عنصر Object) متد پشته را برای عنصر مشخص شده جستجو می کند. اگر عنصر مورد نیاز پیدا شود، "فاصله" آن از بالا (شماره سریال) برگردانده می شود. اگر عنصر پیدا نشد، -1 برگردانده می شود.
نمونه کد پشته
بیایید یک مثال برنامه بسازیم که مانند تصویر گیف بالا کار کند. ما سه "توپ"، نارنجی، بنفش و سبز را روی پشته قرار می دهیم. بیایید پشته را برای خالی بودن بررسی کنیم. سپس، تا زمانی که پشته خالی شود، توپ ها را از پشته استخراج می کنیم.import java.util.Stack;
public class myStackTest2 {
public static void main(String[] args)
{
Stack myStack= new Stack<>();
System.out.println("Is my stack empty? " + myStack.empty());
// pushing elements into stack
myStack.push("Orange Ball");
myStack.push("Violet Ball");
myStack.push("Green Ball");
//prints elements of the stack
System.out.println("Elements in Stack: " + myStack);
System.out.println("Is my stack empty? " + myStack.empty());
while (!myStack.isEmpty()) {
myStack.pop();
System.out.println("Elements in Stack: " + myStack);
System.out.println("Is my stack empty? " + myStack.empty());
}
}
}
این هم خروجی این برنامه:
import java.util.Stack;
public class myStackTest2 {
public static void main(String[] args)
{
Stack myStack= new Stack<>();
System.out.println("Is my stack empty? " + myStack.empty());
// pushing elements into stack
myStack.add("Orange Ball");
myStack.add("Violet Ball");
myStack.add("Green Ball");
//prints elements of the stack
System.out.println("Elements in Stack: " + myStack);
System.out.println("Is my stack empty? " + myStack.empty());
while (!myStack.isEmpty()) {
myStack.pop();
System.out.println("Elements in Stack: " + myStack);
System.out.println("Is my stack empty? " + myStack.empty());
}
}
}
نتیجه کار برنامه البته دقیقاً همین خواهد بود.
در مورد پیاده سازی Stack خودتان چطور؟
شما می توانید ساختار داده پشته خود را در جاوا با استفاده از آرایه ها یا کلاس های لیست پیوندی ایجاد کنید. در حالت اول، یک آرایه پیوسته از سلول ها برای ذخیره مقادیر در حافظه اختصاص داده می شود که در صورت نیاز از آنها استفاده می شود. در مرحله دوم، برای هر عنصر پشته، یک بلوک حافظه مرتب می شود که برای ذخیره مقدار و ارجاع به عناصر قبلی و بعدی پشته کافی است. پیادهسازی مبتنی بر آرایه سادهتر، کارآمدتر و کارآمدتر از حافظه است، اما نیاز به دانش قبلی از محدودیت اندازه پشته دارد و میتواند منجر به یافتن اشکالات سخت شود. پیاده سازی مبتنی بر لیست قوی تر اما کارآمدتر است. بیایید یک پیاده سازی ساده مبتنی بر آرایه از پشته ایجاد کنیم. شامل توابع خواهد بود.-
فشار - روشی که افزودن یک عنصر (در موقعیت بالا) را تضمین می کند.
-
pop - روشی که حذف یک عنصر (از موقعیت بالا) را فراهم می کند.
-
readTop - روشی که مقدار عنصری را که در موقعیت بالا قرار دارد برمی گرداند
-
sEmpty - روشی که پشته را برای خالی بودن بررسی می کند
-
isFull - روشی که بررسی می کند آیا آرایه ما که پشته را در آن ذخیره می کنیم پر نیست یا خیر
import java.util.Arrays;
public class MyStack {
private int maxSize;
private String[] stackArray;
private int top;
public MyStack(int size) {
this.maxSize = size;
stackArray = new String[maxSize];
top = -1;
}
public String push (String element) {
return stackArray[++top] = element;
}
public String pop (String element) {
if (isEmpty())
{
System.out.println("Underflow\nProgram Terminated");
System.exit(-1);
}
System.out.println("Removing " + readTop());
return stackArray[top--];
}
public String readTop() {
return stackArray[top];
}
public boolean isEmpty() {
return (top == -1);
}
public boolean isFull() {
return (top == maxSize - 1);
}
public void printStack(){
System.out.println(Arrays.toString(stackArray));
}
}
حالا بیایید یک مثال را با سه توپ بر اساس پشته خود پیاده سازی کنیم:
public class myStackTest {
public static void main(String[] args) {
MyStack myStack = new MyStack(3);
System.out.println("Is my stack empty? " + myStack.isEmpty());
myStack.push("Orange Ball");
myStack.push("Violet Ball");
myStack.push("Green Ball");
myStack.printStack();
System.out.println("Is my stack empty? " + myStack.isEmpty());
while (!myStack.isEmpty()) {
myStack.pop(myStack.readTop());
System.out.println("Is my stack empty? " + myStack.isEmpty());
}
}
}
خروجی اینجاست:
GO TO FULL VERSION