CodeGym /Java Blog /এলোমেলো /জাভা স্ট্যাক
John Squirrels
লেভেল 41
San Francisco

জাভা স্ট্যাক

এলোমেলো দলে প্রকাশিত
জাভাতে স্ট্যাক বলতে সাধারণত সংগ্রহ ফ্রেমওয়ার্কের ক্লাস বোঝায় যা তালিকা ইন্টারফেস প্রয়োগ করে। এটি স্ট্যাক ডেটা স্ট্রাকচারের নীতির উপর কাজ করে, যা মেমরির ধরনগুলির একটিকে সংগঠিত করতে ব্যবহৃত হয়। এছাড়াও এটি ডেটা রাখা মেমরির অংশ হতে পারে, এই নিবন্ধে আমরা প্রথমে স্ট্যাক ক্লাসে মনোযোগ দেব, এর পদ্ধতিগুলি বিবেচনা করব এবং উদাহরণ দেব। তবে আমরা স্ট্যাকের মতো ডেটা স্ট্রাকচার এবং এটি কীসের জন্য ব্যবহৃত হয় সে সম্পর্কেও কথা বলব।

স্ট্যাক ডেটা স্ট্রাকচার কি

প্রথমত, স্ট্যাক ডেটা স্ট্রাকচার কী তা দ্রুত দেখে নেওয়া যাক। এটি একটি লিনিয়ার ডেটা স্ট্রাকচার যা লাস্ট-ইন-ফার্স্ট-আউট (LIFO) নীতির উপর ভিত্তি করে। এটা বিরোধী সারি ধরনের. একটি বাক্সে কার্ডের ডেক বা বইয়ের স্তুপ কল্পনা করুন। আপনি প্রথমে যে বইটি স্ট্যাকের মধ্যে রেখেছেন তা নীচে, এবং প্রথমে আমরা বাক্সের বাইরে যে বইটি তুলে নেব সেটি হল শীর্ষে থাকা বইটি - অর্থাৎ, যেটি বাক্সে শেষ হয়েছে। এই নীতিটি প্রদর্শন করার জন্য এখানে একটি জিআইএফ ছবি রয়েছে। জাভা স্ট্যাক - 1এখানে কি হচ্ছে? আমাদের একটি ফ্লাস্ক রয়েছে যাতে একটি সময়ে একটি মাত্র বল আঘাত করতে পারে। ফ্লাস্কে প্রথমে একটি কমলা বল, তারপরে বেগুনি এবং অবশেষে সবুজ (যারা এই রঙের আরও সঠিক নাম জানেন তাদের কাছে আমি ক্ষমাপ্রার্থী)। যাইহোক, আমাদের ফ্লাস্ক-স্ট্যাক থেকে একটি কমলা বল বের করার জন্য, আমাদের প্রথমে যে বলটি শেষ হয়েছে (সবুজটি) বের করতে হবে, তারপরে যেটি শেষ ছিল (কিন্তু নিষ্কাশনের সময় এটি শেষ ছিল) এক). জাভা বা প্রোগ্রামিং এর অন্য কোথাও স্ট্যাক ডেটা স্ট্রাকচারে দুটি সবচেয়ে গুরুত্বপূর্ণ অপারেশন রয়েছে, পুশ এবং পপ । পুশ অপারেশন স্ট্যাকের মধ্যে একটি উপাদান সন্নিবেশ করায় এবং পপ অপারেশন স্ট্যাকের শীর্ষ থেকে একটি উপাদান সরিয়ে দেয়।

স্ট্যাক ডেটা স্ট্রাকচার কিসের জন্য?

স্ট্যাকের সবচেয়ে গুরুত্বপূর্ণ ব্যবহারগুলির মধ্যে একটি হল সাবরুটিন কলগুলি সংগঠিত করা। স্ট্যাকের কল পয়েন্টটি সাবরুটিনটি বন্ধ হয়ে যাওয়ার পরে (এবং সম্ভবত প্যারামিটারগুলি পাস) থেকে ফেরত ঠিকানা সংরক্ষণ করে। সাবরুটিনের প্রতিটি নেস্টেড (পুনরাবৃত্ত সহ) কলের সাথে, স্ট্যাকে নতুন রিটার্ন ঠিকানা যোগ করা হয়। সাবরুটিন (রিটার্ন) থেকে প্রতিটি রিটার্ন অপারেশনের সাথে, স্ট্যাক থেকে রিটার্ন ঠিকানাটি সরানো হয় এবং নিয়ন্ত্রণ এটিতে স্থানান্তরিত হয়। এই অ্যাপ্লিকেশনটি প্রোগ্রামিংয়ের জন্য এত গুরুত্বপূর্ণ যে বেশিরভাগ প্রসেসরে রিটার্ন স্ট্যাকটি নির্দেশনা সেটে হার্ডওয়্যারে প্রয়োগ করা হয়। যাইহোক, অন্যান্য ক্ষেত্রে, স্ট্যাকটিকে আরও সাধারণ ডেটা স্ট্রাকচারের উপর মডেল করতে হবে।

সংগ্রহ ফ্রেমওয়ার্ক জাভা স্ট্যাক ক্লাস

জাভা স্ট্যাক ক্লাস হল কালেকশন ফ্রেমওয়ার্কের একটি ক্লাস যা লিস্ট ইন্টারফেস প্রয়োগ করে এবং ভেক্টর ক্লাস প্রসারিত করে। এটি ইন্টারফেস সংগ্রহ, পুনরাবৃত্তিযোগ্য, ক্লোনযোগ্য, সিরিয়ালাইজেবল প্রয়োগ করে। আপনি সম্ভবত ইতিমধ্যে অনুমান করেছেন যে এই শ্রেণীটি বস্তুর LIFO স্ট্যাকের প্রতিনিধিত্ব করে। এখানে স্ট্যাক ক্লাসের কনস্ট্রাক্টরকে কল করা হয়েছে , অর্থাৎ এই ক্লাসের একটি অবজেক্ট তৈরি করা হয়েছে।

Stack<E> stack = new Stack<E>();
যেখানে E হল অবজেক্টের ধরন।

জাভা স্ট্যাক পদ্ধতি

এই ক্লাসে শুধুমাত্র একটি ডিফল্ট কনস্ট্রাক্টর এবং ভেক্টর ক্লাসের সমস্ত পদ্ধতি রয়েছে । এছাড়াও, স্ট্যাকের নিজস্ব 5টি পদ্ধতি রয়েছে:
  • বুলিয়ান খালি() পদ্ধতিটি স্ট্যাক খালি কিনা তা পরীক্ষা করে। স্ট্যাক খালি থাকলে সত্য , না থাকলে মিথ্যা দেখায় ।

  • অবজেক্ট পিক() পদ্ধতিটি স্ট্যাকের শীর্ষে থাকা উপাদানটিকে ফেরত দেয়।

  • অবজেক্ট পপ() পদ্ধতিটি স্ট্যাকের শীর্ষে থাকা উপাদানটিকে ফিরিয়ে দেয় এবং এটিকে সরিয়ে দেয়।

  • অবজেক্ট পুশ(অবজেক্ট এলিমেন্ট) পদ্ধতিটি নির্দিষ্ট উপাদানটিকে স্ট্যাকের শীর্ষে যোগ করে।

  • int অনুসন্ধান (অবজেক্ট উপাদান) পদ্ধতিটি নির্দিষ্ট উপাদানের জন্য স্ট্যাক অনুসন্ধান করে। যদি প্রয়োজনীয় উপাদানটি পাওয়া যায়, উপরের থেকে এর "দূরত্ব" (ক্রমিক নম্বর) ফেরত দেওয়া হয়। যদি উপাদানটি পাওয়া না যায়, -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());
           }
       }
   }
এখানে এই প্রোগ্রামের আউটপুট:
আমার স্ট্যাক খালি? স্ট্যাকের আসল উপাদান: [কমলা বল, ভায়োলেট বল, সবুজ বল] আমার স্ট্যাক কি খালি? স্ট্যাকের মধ্যে মিথ্যা উপাদান: [অরেঞ্জ বল, ভায়োলেট বল] আমার স্ট্যাক কি খালি? স্ট্যাকের মিথ্যা উপাদান: [কমলা বল] আমার স্ট্যাক কি খালি? স্ট্যাকের মধ্যে মিথ্যা উপাদান: [] আমার স্ট্যাক খালি? সত্য
যেহেতু স্ট্যাক ভেক্টর ক্লাস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত এবং তালিকা ইন্টারফেস প্রয়োগ করে, স্ট্যাক , উপাদানগুলি যোগ এবং নিষ্কাশন করার জন্য এই ডেটা স্ট্রাকচারের ক্লাসিক পুশ এবং পপ অপারেশন ছাড়াও, তালিকা কাঠামো অ্যাড() এবং রিমুভ() অপারেশনের জন্যও স্ট্যান্ডার্ড রয়েছে। আমাদের উদাহরণে, 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());
           }
       }
   }
প্রোগ্রাম কাজের ফলাফল, অবশ্যই, ঠিক একই হবে।

আপনার নিজের স্ট্যাক বাস্তবায়ন সম্পর্কে কি?

আপনি অ্যারে বা লিঙ্কযুক্ত তালিকা ক্লাস ব্যবহার করে জাভাতে আপনার নিজস্ব স্ট্যাক ডেটা কাঠামো তৈরি করতে পারেন। প্রথম ক্ষেত্রে, মেমরিতে মানগুলি সংরক্ষণ করার জন্য কোষগুলির একটি ক্রমাগত অ্যারে বরাদ্দ করা হয়, যা প্রয়োজন অনুসারে ব্যবহার করা হয়। দ্বিতীয়টিতে, স্ট্যাকের প্রতিটি উপাদানের জন্য, মেমরির একটি ব্লক অর্ডার করা হয়, যা স্ট্যাকের পূর্ববর্তী এবং পরবর্তী উপাদানগুলির মান এবং রেফারেন্স সংরক্ষণ করার জন্য যথেষ্ট। অ্যারে-ভিত্তিক বাস্তবায়ন সহজ, আরও দক্ষ এবং আরও মেমরি দক্ষ, তবে এটি স্ট্যাকের আকারের সীমা সম্পর্কে পূর্ব জ্ঞানের প্রয়োজন এবং এটি খুঁজে পাওয়া কঠিন বাগগুলির দিকে পরিচালিত করতে পারে। তালিকা-ভিত্তিক বাস্তবায়ন আরও শক্তিশালী কিন্তু কম দক্ষ। স্ট্যাকের একটি সহজ অ্যারে-ভিত্তিক বাস্তবায়ন করা যাক। এটা ফাংশন অন্তর্ভুক্ত করা হবে.
  • 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