CodeGym /جاوا بلاگ /Random-UR /جاوا اسٹیک
John Squirrels
سطح
San Francisco

جاوا اسٹیک

گروپ میں شائع ہوا۔
جاوا میں اسٹیک کا مطلب عام طور پر کلیکشن فریم ورک کی کلاس ہے جو فہرست انٹرفیس کو نافذ کرتی ہے۔ یہ Stack ڈیٹا سٹرکچر کے اصول پر کام کرتا ہے، جو میموری کی اقسام میں سے ایک کو منظم کرنے کے لیے استعمال ہوتا ہے۔ اس کے علاوہ ڈیٹا رکھنا میموری کا حصہ بھی ہو سکتا ہے، اس آرٹیکل میں ہم سب سے پہلے اسٹیک کلاس پر توجہ دیں گے، اس کے طریقوں پر غور کریں گے اور مثالیں دیں گے۔ لیکن ہم اس طرح کے ڈیٹا ڈھانچے کے بارے میں بھی بات کریں گے جیسے Stack اور یہ کس چیز کے لیے استعمال ہوتا ہے۔

اسٹیک ڈیٹا سٹرکچر کیا ہے؟

سب سے پہلے، آئیے اس پر ایک سرسری نظر ڈالتے ہیں کہ اسٹیک ڈیٹا ڈھانچہ کیا ہے۔ یہ ایک لکیری ڈیٹا ڈھانچہ ہے جو Last-in-First-out (LIFO) اصول پر مبنی ہے۔ یہ ایک قسم کی مخالف قطار ہے۔ ایک ڈبے میں تاش کے ڈیک یا کتابوں کے ڈھیر کا تصور کریں۔ آپ جو کتاب پہلے اسٹیک میں ڈالتے ہیں وہ سب سے نیچے ہے، اور سب سے پہلے ہم باکس سے باہر نکالیں گے وہ کتاب ہے جو سب سے اوپر تھی - یعنی وہ جو باکس میں سب سے آخر میں آئی تھی۔ اس اصول کو ظاہر کرنے کے لیے یہاں ایک GIF تصویر ہے۔ جاوا اسٹیک - 1یہاں کیا ہو رہا ہے؟ ہمارے پاس ایک فلاسک ہے جس میں ایک وقت میں صرف ایک گیند لگ سکتی ہے۔ فلاسک میں سب سے پہلے ایک نارنجی گیند ہے، پھر جامنی، اور آخر میں سبز (میں ان سے معذرت خواہ ہوں جو ان رنگوں کے زیادہ درست نام جانتے ہیں)۔ تاہم اپنے فلاسک اسٹیک سے نارنجی گیند کو نکالنے کے لیے، ہمیں پہلے اس گیند کو نکالنا ہوگا جو وہاں سب سے آخر میں پہنچی تھی (سبز رنگ کی)، پھر وہ جو آخری تھی (لیکن نکالنے کے وقت یہ آخری ہے) ایک)۔ جاوا یا پروگرامنگ میں کسی اور جگہ اسٹیک ڈیٹا سٹرکچر میں دو اہم ترین آپریشنز ہوتے ہیں، push اور pop ۔ پش آپریشن اسٹیک میں ایک عنصر داخل کرتا ہے اور پاپ آپریشن اسٹیک کے اوپری حصے سے ایک عنصر کو ہٹاتا ہے۔

اسٹیک ڈیٹا ڈھانچہ کس کے لیے ہے؟

اسٹیک کے سب سے اہم استعمال میں سے ایک سب روٹین کالز کو منظم کرنا ہے۔ اسٹیک پر کال پوائنٹ سب روٹین کے ختم ہونے کے بعد واپسی ایڈریس کو اسٹور کرتا ہے (اور ممکنہ طور پر پیرامیٹرز گزر چکے ہیں)۔ سب روٹینز کی ہر نیسٹڈ (بار بار چلنے والی) کال کے ساتھ، نئے واپسی پتے اسٹیک میں شامل کیے جاتے ہیں۔ سب روٹین (واپسی) سے ہر ریٹرن آپریشن کے ساتھ، واپسی کا پتہ اسٹیک سے ہٹا دیا جاتا ہے اور کنٹرول اس پر منتقل کر دیا جاتا ہے۔ یہ ایپلیکیشن پروگرامنگ کے لیے اتنی اہم ہے کہ زیادہ تر پروسیسرز میں ریٹرن اسٹیک کو انسٹرکشن سیٹ میں ہارڈ ویئر میں لاگو کیا جاتا ہے۔ تاہم، دیگر معاملات میں، اسٹیک کو زیادہ عام ڈیٹا ڈھانچے پر ماڈل بنانا ہوگا۔

جاوا اسٹیک کلاس آف کلیکشن فریم ورک

جاوا میں اسٹیک کلاس کلیکشن فریم ورک کی ایک کلاس ہے جو لسٹ انٹرفیس کو نافذ کرتی ہے اور ویکٹر کلاس کو بڑھاتی ہے۔ یہ انٹرفیس کلیکشن، اٹیریبل، کلون ایبل، سیریلائز ایبل بھی لاگو کرتا ہے۔ جیسا کہ آپ نے پہلے ہی اندازہ لگایا ہے کہ یہ کلاس اشیاء کے LIFO اسٹیک کی نمائندگی کرتی ہے۔ یہاں اسٹیک کلاس کے کنسٹرکٹر کو کال ہے ، یعنی اس کلاس کی کسی چیز کی تخلیق۔
Stack<E> stack = new Stack<E>();
جہاں E آبجیکٹ کی قسم ہے۔

جاوا اسٹیک کے طریقے

اس کلاس میں صرف ایک ڈیفالٹ کنسٹرکٹر اور ویکٹر کلاس کے تمام طریقے ہیں ۔ اس کے علاوہ، اسٹیک کے اپنے 5 طریقے ہیں:
  • boolean empty() طریقہ چیک کرتا ہے کہ آیا اسٹیک خالی ہے یا نہیں۔ اگر اسٹیک خالی ہے تو درست ، اگر نہیں تو غلط لوٹاتا ہے ۔

  • آبجیکٹ peek() طریقہ اس عنصر کو لوٹاتا ہے جو اسٹیک کے اوپر ہے۔

  • آبجیکٹ پاپ() طریقہ عنصر کو لوٹاتا ہے جو اسٹیک کے اوپر ہے اور اسے ہٹا دیتا ہے۔

  • آبجیکٹ پش (آبجیکٹ عنصر) طریقہ مخصوص عنصر کو اسٹیک کے اوپری حصے میں شامل کرتا ہے۔

  • int سرچ (آبجیکٹ عنصر) طریقہ مخصوص عنصر کے اسٹیک کو تلاش کرتا ہے۔ اگر مطلوبہ عنصر پایا جاتا ہے، تو اوپر سے اس کا "فاصلہ" (سیریل نمبر) لوٹا دیا جاتا ہے۔ اگر عنصر نہیں ملتا ہے، تو -1 واپس آ جاتا ہے۔

اسٹیک کوڈ کی مثال

آئیے ایک پروگرام کی مثال بنائیں جو اوپر GIF تصویر کی طرح کام کرے۔ ہم اسٹیک پر تین "گیندیں" ڈالیں گے، نارنجی، جامنی اور سبز۔ آئیے خالی پن کے لیے اسٹیک کو چیک کریں۔ پھر، ہم اسٹیک سے گیندیں نکالیں گے جب تک کہ اسٹیک خالی نہ ہو جائے۔
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());
           }
       }
   }
اس پروگرام کا آؤٹ پٹ یہ ہے:
کیا میرا اسٹیک خالی ہے؟ اسٹیک میں حقیقی عناصر: [اورنج بال، وایلیٹ بال، گرین بال] کیا میرا اسٹیک خالی ہے؟ اسٹیک میں غلط عناصر: [اورنج بال، وایلیٹ بال] کیا میرا اسٹیک خالی ہے؟ اسٹیک میں غلط عناصر: [اورنج بال] کیا میرا اسٹیک خالی ہے؟ اسٹیک میں غلط عناصر: [] کیا میرا اسٹیک خالی ہے؟ سچ
چونکہ Stack کو ویکٹر کلاس سے وراثت میں ملا ہے اور List انٹرفیس کو لاگو کرتا ہے، Stack ، عناصر کو شامل کرنے اور نکالنے کے لیے اس ڈیٹا سٹرکچر کے لیے کلاسک پش اور پاپ آپریشنز کے علاوہ، فہرست کی ساخت add() اور remove() آپریشنز کے لیے بھی معیاری ہے۔ ہماری مثال میں، add() طریقہ استعمال کرتے ہوئے عناصر کو شامل کرنا اسی طرح لاگو کیا جا سکتا ہے ۔ تاہم آپ ریمو() کا استعمال کرتے ہوئے صرف ایک مخصوص عنصر کے ساتھ نکال سکتے ہیں ، جو اسٹیک ڈیٹا سٹرکچر کے لیے کوئی معنی نہیں رکھتا۔
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());
           }
       }
   }
پروگرام کے کام کا نتیجہ، بالکل، بالکل وہی ہو گا.

آپ کے اپنے اسٹیک کے نفاذ کے بارے میں کیا خیال ہے؟

آپ جاوا میں صفوں یا لنکڈ لسٹ کلاسز کا استعمال کرتے ہوئے اپنا اسٹیک ڈیٹا ڈھانچہ بنا سکتے ہیں۔ پہلی صورت میں، میموری میں اقدار کو ذخیرہ کرنے کے لیے خلیوں کی ایک مسلسل صف مختص کی جاتی ہے، جو ضرورت کے مطابق استعمال ہوتی ہیں۔ دوسرے میں، اسٹیک کے ہر عنصر کے لیے، میموری کا ایک بلاک آرڈر کیا جاتا ہے، جو اسٹیک کے پچھلے اور اگلے عناصر کی قدر اور حوالہ جات کو ذخیرہ کرنے کے لیے کافی ہے۔ صف پر مبنی نفاذ آسان، زیادہ موثر، اور زیادہ میموری موثر ہے، لیکن اس کے لیے اسٹیک سائز کی حد کے بارے میں پیشگی معلومات درکار ہوتی ہیں اور یہ مشکل سے ڈھونڈنے والے کیڑے کا باعث بن سکتا ہے۔ فہرست پر مبنی عمل درآمد زیادہ مضبوط لیکن کم موثر ہے۔ آئیے اسٹیک کا ایک سادہ سرنی پر مبنی نفاذ کرتے ہیں۔ اس میں افعال شامل ہوں گے۔
  • push - ایک ایسا طریقہ جو کسی عنصر کے اضافے کو یقینی بنائے گا (اوپر کی پوزیشن میں)

  • pop - ایک ایسا طریقہ جو کسی عنصر کو ہٹانے کی سہولت فراہم کرے گا (اوپر کی پوزیشن سے)

  • readTop - ایک ایسا طریقہ جو اس عنصر کی قدر واپس کرے گا جو پوزیشن ٹاپ پر ہے۔

  • sEmpty - ایک طریقہ جو خالی ہونے کے لئے اسٹیک کو چیک کرے گا۔

  • isFul — ایک طریقہ جو یہ چیک کرے گا کہ آیا ہماری صف جس میں ہم اسٹیک کو اسٹور کرتے ہیں بھرا نہیں ہے۔

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());
       }
   }

}
آؤٹ پٹ یہاں ہے:
کیا میرا اسٹیک خالی ہے؟ true [اورنج بال، وایلیٹ بال، گرین بال] کیا میرا اسٹیک خالی ہے؟ غلط سبز گیند کو ہٹانا کیا میرا اسٹیک خالی ہے؟ غلط وائلٹ بال کو ہٹانا کیا میرا اسٹیک خالی ہے؟ غلط اورنج بال کو ہٹانا کیا میرا اسٹیک خالی ہے؟ سچ
اگر آپ قریب سے دیکھیں تو سب سے اوپر متغیر دراصل آخری عنصر کا اشاریہ رکھتا ہے، اور آبجیکٹ کا حوالہ صف میں رہتا ہے۔ اس لیے اس نفاذ میں کچھ بہتری کی ضرورت ہے۔ ایسا کرنے کا آسان ترین طریقہ سوچیں۔

کیا ہمیں جاوا اسٹیک استعمال کرنا چاہئے؟

درحقیقت، جاوا اسٹیک ، اس کے ویکٹر پیرنٹ کی طرح، ایک میراثی کلاس ہے۔ اس کے بجائے، ArrayList کلاس عام طور پر استعمال ہوتی ہے۔ ArrayList مطابقت پذیر نہیں ہے جبکہ Vector مطابقت پذیر ہے۔ اس کا مطلب ہے کہ ویکٹر کے ساتھ ایک وقت میں صرف ایک تھریڈ کوڈ تک رسائی حاصل کر سکتا ہے، جبکہ ArrayList متعدد تھریڈز کے ساتھ کام کر سکتا ہے۔ نیز، ArrayList زیادہ موثر اور تیز ہے۔ اس لیے آپ کو غالباً یہ کلاس صرف لیگیسی کوڈ میں نظر آئے گی۔ لیکن اسٹیک ڈیٹا ڈھانچہ پروگرامنگ میں اکثر استعمال ہوتا ہے۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION