CodeGym /جاوا بلاگ /Random-SD /جاوا اسٽيڪ
John Squirrels
سطح
San Francisco

جاوا اسٽيڪ

گروپ ۾ شايع ٿيل
جاوا ۾ اسٽيڪ جو مطلب عام طور تي ڪليڪشن فريم ورڪ مان ڪلاس آھي جيڪو لسٽ انٽرفيس کي لاڳو ڪري ٿو. اهو اسٽيڪ ڊيٽا جي جوڙجڪ جي اصول تي ڪم ڪري ٿو، جيڪو ميموري جي قسمن مان هڪ کي منظم ڪرڻ لاء استعمال ڪيو ويندو آهي. اهو پڻ ڊيٽا کي رکڻ لاءِ ميموري جو حصو ٿي سگهي ٿو، هن آرٽيڪل ۾ اسان سڀ کان پهريان اسٽيڪ ڪلاس تي ڌيان ڏينداسين، ان جي طريقن تي غور ڪنداسين ۽ مثال ڏينداسين. پر اسان اهڙي ڊيٽا جي جوڙجڪ جي باري ۾ پڻ ڳالهائينداسين جيئن Stack ۽ اهو ڇا لاء استعمال ڪيو ويندو آهي.

اسٽيڪ ڊيٽا جي جوڙجڪ ڇا آهي

سڀ کان پهريان، اچو ته هڪ تڪڙو نظر رکون ته اسٽيڪ ڊيٽا جي جوڙجڪ ڇا آهي. اهو هڪ لڪير واري ڊيٽا جي جوڙجڪ آهي جيڪا Last-in-First-out (LIFO) اصول تي ٻڌل آهي. اهو قسم جي مخالف قطار آهي. تصور ڪريو ڪارڊن جي ڊيڪ يا دٻي ۾ ڪتابن جي اسٽيڪ. توهان جيڪو ڪتاب اسٽيڪ ۾ رکون ٿا اهو سڀ کان پهرين هيٺان آهي، ۽ سڀ کان پهرين اسان دٻي مان ڪڍنداسين اهو ڪتاب آهي جيڪو مٿي تي هو - يعني، جيڪو دٻي ۾ داخل ٿيو. ھتي آھي ھڪڙو گف تصوير ھن اصول کي ڏيکارڻ لاءِ. جاوا اسٽيڪ - 1هتي ڇا ٿي رهيو آهي؟ اسان وٽ هڪ فلاسڪ آهي جنهن ۾ صرف هڪ بال هڪ وقت ۾ اچي سگهي ٿو. فلاسڪ ۾ پهريون نارنگي بال آهي، پوء جامني، ۽ آخر ۾ سائو (مان انهن کان معافي وٺان ٿو جيڪي انهن رنگن جا وڌيڪ صحيح نالا ڄاڻن ٿا). تنهن هوندي به اسان جي فلاسڪ اسٽيڪ مان نارنجي بال کي ڪڍڻ لاءِ، اسان کي پهرين اهو بال ڪڍڻو پوندو جيڪو اتي آيو (سائي رنگ جو)، پوءِ اهو جيڪو آخري هوندو هو (پر ڪڍڻ وقت اهو آخري هوندو آهي. هڪ). جاوا يا پروگرامنگ ۾ ٻين هنڌن تي اسٽيڪ ڊيٽا جي جوڙجڪ ۾ ٻه اهم عمل آهن، push ۽ pop . پش آپريشن هڪ عنصر کي اسٽيڪ ۾ داخل ڪري ٿو ۽ پاپ آپريشن هڪ عنصر کي اسٽيڪ جي چوٽي تان هٽائي ٿو.

اسٽيڪ ڊيٽا جي جوڙجڪ ڇا لاءِ آهي؟

اسٽيڪ جي سڀ کان اهم استعمالن مان هڪ آهي سبروٽين ڪالن کي منظم ڪرڻ. اسٽيڪ تي ڪال پوائنٽ ذخيرو ڪري ٿو واپسي ايڊريس کي سب روٽين کان پوءِ ختم ٿيڻ کان پوءِ (۽ ممڪن طور تي پيٽرول پاس ٿي ويا). سب روٽينز جي هر نيسٽڊ (بشمول ورجائيندڙ) ڪال سان، نوان موٽڻ جا پتا شامل ڪيا ويا آهن اسٽيڪ ۾. سبروٽين (واپسي) مان هر واپسي جي آپريشن سان، واپسي جو پتو اسٽيڪ مان هٽايو ويندو آهي ۽ ڪنٽرول ان ڏانهن منتقل ڪيو ويندو آهي. هي ايپليڪيشن پروگرامنگ لاءِ تمام ضروري آهي ته اڪثر پروسيسرز ۾ ريٽرن اسٽيڪ کي هارڊويئر ۾ هدايتون سيٽ ۾ لاڳو ڪيو ويندو آهي. جڏهن ته، ٻين ڪيسن ۾، اسٽيڪ کي وڌيڪ عام ڊيٽا جي جوڙجڪ تي ماڊل ڪيو وڃي.

جاوا اسٽيڪ ڪلاس آف ڪليڪشن فريم ورڪ

جاوا ۾ اسٽيڪ ڪلاس ڪليڪشن فريم ورڪ مان ھڪڙو ڪلاس آھي جيڪو لسٽ انٽرفيس کي لاڳو ڪري ٿو ۽ ویکٹر ڪلاس کي وڌائي ٿو. اهو پڻ لاڳو ڪري ٿو انٽرفيس گڏ ڪرڻ، ٻيهر قابل، ڪلونبل، سيريلائيبل. جيئن ته توهان اڳ ۾ ئي اندازو لڳايو آهي ته هي طبقو شين جي LIFO اسٽيڪ جي نمائندگي ڪري ٿو. ھتي ڪال آھي اسٽيڪ ڪلاس جي ٺاھيندڙ کي، يعني ھن طبقي جي ھڪڙي شئي جي تخليق.
Stack<E> stack = new Stack<E>();
جتي اي شئي جو قسم آهي.

جاوا اسٽيڪ جا طريقا

ھن ڪلاس ۾ صرف ھڪڙو ڊفالٽ ٺاھيندڙ آھي ۽ ویکٹر ڪلاس جا سڀ طريقا . پلس، اسٽيڪ جا پنهنجا 5 طريقا آهن:
  • boolean empty() طريقو چيڪ ڪري ٿو ته اسٽيڪ خالي آهي يا نه. واپسي صحيح آھي جيڪڏھن اسٽيڪ خالي آھي، غلط آھي جيڪڏھن نه.

  • Object peek() طريقو اهو عنصر واپس ڪري ٿو جيڪو اسٽيڪ جي چوٽي تي آهي.

  • آبجیکٹ پاپ () طريقو عنصر کي واپس ڪري ٿو جيڪو اسٽيڪ جي چوٽي تي آهي ۽ ان کي هٽائي ٿو.

  • Object push (Object element) طريقو مخصوص عنصر کي اسٽيڪ جي چوٽي تي شامل ڪري ٿو.

  • int ڳولا (Object element) جو طريقو مخصوص عنصر لاءِ اسٽيڪ کي ڳولهي ٿو. جيڪڏهن گهربل عنصر مليو آهي، ان جو "فاصلو" مٿين کان (سيريل نمبر) واپس ڪيو ويو آهي. جيڪڏهن عنصر نه مليو آهي، -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 ویکٹر ڪلاس مان ورثي ۾ ملي ٿو ۽ لسٽ انٽرفيس کي لاڳو ڪري ٿو، Stack ، عناصر کي شامل ڪرڻ ۽ ڪڍڻ لاءِ هن ڊيٽا ڍانچي لاءِ کلاسڪ پش ۽ پاپ آپريشنز کان علاوه، لسٽ جي جوڙجڪ add() ۽ remove() آپريشنز لاءِ پڻ معيار آهي. اسان جي مثال ۾، عناصر شامل ڪرڻ ساڳئي طريقي سان لاڳو ڪري سگھجي ٿو add() طريقو استعمال ڪندي. جڏهن ته توهان ڪڍي سگهو ٿا remove() صرف هڪ عنصر سان بيان ڪيو ويو آهي، جيڪو اسٽيڪ ڊيٽا جي جوڙجڪ لاء ڪو به احساس ناهي.
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());
           }
       }
   }
پروگرام جي ڪم جو نتيجو، يقينا، بلڪل ساڳيو ٿيندو.

توهان جي پنهنجي اسٽيڪ تي عملدرآمد بابت ڇا؟

توھان ٺاھي سگھوٿا پنھنجي اسٽيڪ ڊيٽا جي جوڙجڪ جاوا ۾ arrays يا ڳنڍيل لسٽ ڪلاس استعمال ڪندي. پهرين صورت ۾، سيلز جي هڪ مسلسل صف کي ميموري ۾ قدرن کي ذخيرو ڪرڻ لاء مختص ڪيو ويو آهي، جيڪي ضرورت مطابق استعمال ڪيا ويندا آهن. سيڪنڊ ۾، اسٽيڪ جي هر عنصر لاء، ميموري جو هڪ بلاڪ حڪم ڏنو ويو آهي، قيمت کي ذخيرو ڪرڻ لاء ڪافي آهي ۽ اسٽيڪ جي پوئين ۽ ايندڙ عناصر ڏانهن حوالو. صف جي بنياد تي عمل درآمد آسان، وڌيڪ ڪارائتو، ۽ وڌيڪ ميموري ڪارائتو آهي، پر ان کي اسٽيڪ سائيز جي حد جي اڳئين ڄاڻ جي ضرورت آهي ۽ ان کي ڳولڻ ۾ مشڪل جي سبب ٿي سگهي ٿو. لسٽ تي ٻڌل عمل وڌيڪ مضبوط پر گهٽ موثر آهي. اچو ته اسٽيڪ جي هڪ سادي صف تي ٻڌل عمل درآمد ڪريون. ان ۾ فنڪشن شامل هوندا.
  • push - هڪ طريقو جيڪو هڪ عنصر جي اضافي کي يقيني بڻائيندو (مٿين پوزيشن ۾)

  • پاپ - هڪ طريقو جيڪو مهيا ڪندو هڪ عنصر کي ختم ڪرڻ (مٿين پوزيشن کان)

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

}
پيداوار هتي آهي:
ڇا منهنجو اسٽيڪ خالي آهي؟ صحيح [نارنگي بال، وايوليٽ بال، گرين بال] ڇا منهنجو اسٽيڪ خالي آهي؟ غلط هٽائڻ گرين بال ڇا منهنجو اسٽيڪ خالي آهي؟ غلط وايوليٽ بال هٽائڻ ڇا منهنجو اسٽيڪ خالي آهي؟ غلط نارنگي بال کي هٽائڻ ڇا منهنجو اسٽيڪ خالي آهي؟ سچو
جيڪڏهن توهان ويجهي ڏسندا آهيو، مٿين متغير اصل ۾ آخري عنصر جي انڊيڪس تي مشتمل آهي، ۽ اعتراض جو حوالو صف ۾ رهي ٿو. تنهن ڪري هن عمل ۾ ڪجهه بهتري جي ضرورت آهي. سوچيو ته اهو ڪرڻ جو آسان طريقو آهي.

ڇا اسان کي جاوا اسٽيڪ استعمال ڪرڻ گھرجي؟

حقيقت ۾، جاوا اسٽيڪ ، ان جي ویکٹر والدين وانگر ، هڪ ورثي طبقي آهي. ان جي بدران، ArrayList ڪلاس عام طور تي استعمال ٿيندو آهي. ArrayList هم وقت سازي نه ڪئي وئي آهي جڏهن ته ویکٹر هم وقت سازي ڪئي وئي آهي. ان جو مطلب آهي ویکٹر سان هڪ وقت ۾ صرف هڪ ٿريڊ ڪوڊ تائين رسائي ڪري سگهي ٿو، جڏهن ته ArrayList ڪيترن ئي موضوعن سان ڪم ڪري سگهي ٿو. پڻ، ArrayList وڌيڪ موثر ۽ تيز آهي. تنهن ڪري توهان گهڻو ڪري ڏسندا هي ڪلاس صرف ورثي ڪوڊ ۾. پر اسٽيڪ ڊيٽا جو ڍانچو گهڻو ڪري پروگرامنگ ۾ استعمال ٿيندو آهي.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION