Data Structure
  • টাইম এন্ড স্পেস কমপ্লেক্সিটি
    • সূচনা
    • টাইম কমপ্লেক্সিটি
    • O(N) টাইম কমপ্লেক্সিটি
    • O(logN) টাইম কমপ্লেক্সিটি
    • O(sqrt(N)) টাইম কমপ্লেক্সিটি
    • টাইম কমপ্লেক্সিটির কিছু উদাহরন
    • টাইম কমপ্লেক্সিটি থেকে টাইম ক্যালকুলেট করা
    • স্পেস কমপ্লেক্সিটি
  • মডিউল ২ঃ STL Vector
    • ২-০ঃ সূচনা
    • ২-১ঃ ভেক্টর ইনিশিয়ালাইজেশন এবং কন্সট্রাক্টর
    • ২-২ঃ ভেক্টর ক্যাপাসিটি ফাংশন
    • ২-৩ঃ ভেক্টর মডিফাইয়ার ফাংশন -১
    • ২-৪ঃ ভেক্টর মডিফাইয়ার ফাংশন -২
    • ২-৫ঃ ভেক্টর এক্সেস এবং ইটারেটর
    • ২-৬ঃ ভেক্টরে ইনপুট নেয়া
    • ২-৭ঃ স্ট্রিং এর ভেক্টর
  • Prefix Sum and Binary Search
    • সূচনা
    • Range Sum Query (Codeforces)
    • Prefix Sum পরিচিতি
    • Prefix sum ইমপ্লিমেন্টেশন
    • Binary Search (Codeforces)
    • বাইনারি সার্চ পরিচিতি
    • বাইনারি সার্চ ইমপ্লিমেন্টেশন
  • মডিউল ৫ঃ Singly Linked List
    • ৫-০ঃ সূচনা
    • ৫-১ঃ Linked List কেন?
    • ৫-২ঃ Linked List কেন? (পার্ট ২)
    • ৫-৩ঃ Create a Node
    • ৫-৪ঃ Constructor of Node
    • ৫-৫ঃ Dynamic Node
    • ৫-৬ঃ Singly Linked List কিভাবে তৈরি হয়
    • ৫-৭ঃ Printing Singly Linked List
    • ৫-৮ঃ Printing Singly Linked List (Animated)
  • মডিউল ৬ঃ Singly Linked List Operation
    • ৬-০ঃ সূচনা
    • ৬-১ঃ পয়েন্টারের রেফারেন্স
    • ৬-২ঃ Tail এ ভ্যালু Insertion
    • ৬-৩ঃ যেকোন পজিশনে ভ্যালু Insertion
    • ৬-৪ঃ Head এ ভ্যালু Insertion
    • ৬-৫ঃ যেকোন পজিশনের ভ্যালু Deletion
    • ৬-৬ঃ Head ডিলিট
    • ৬-৭ঃ Error Handling
    • ৬-৮ঃ Singly Linked List এ ইনপুট
  • মডিউল ৭ঃ Singly Linked List recap
    • ৭-০ঃ সূচনা
    • ৭-১ঃ Singly Linked List recap
    • ৭-২ঃ Insert at Singly Linked List Recap
    • ৭-৩ঃ Insert at Head and Tail at Singly Linked List Recap
    • ৭-৪ঃ Delete from Singly Linked List Recap
    • ৭-৫ঃ Delete Head from Singly Linked List Recap
    • ৭-৬ঃ Take Singly Linked List Input Recap
    • ৭-৭ঃ Printing Singly Linked List in Reverse
    • ৭-৮ঃ Sort Singly Linked List
    • ৭-বোনাসঃ Singly Linked list all operations complexity analysis
  • মডিউল ৯: Doubly Linked List
    • ৯-০ঃ সূচনা
    • ৯ -১ঃ Doubly Linked List
    • ৯-২ঃ Doubly Linked List দেখতে কেমন?
    • ৯-৩ঃ Doubly Linked List এর যেকোনো position এ value insert
    • ৯-৪ঃ Insert at Head and Tail in Doubly Linked List
    • ৯-৫ঃ Insert Operation on Doubly Linked List Animated
    • ৯-৬ঃ Delete Operations on Doubly Linked List
    • ৯-৭ঃ Complexity Analysis
    • মডিউল ৯-৮ঃ Doubly Linked List এ input নেয়া
  • মডিউল ১০: STL List and Cycle Detection
    • ১০-০ঃ সূচনা
    • ১০-১ঃ List Constructors
    • ১০-২ঃ List Capacity Functions
    • ১০-৩ঃ List Modifiers Functions
    • ১০-৪ঃ List Operations and Access Related Function
    • ১০-৫ , ১০-৬ঃ Reverse a Singly Linked List
    • ১০-৭ঃ Reverse a Doubly Linked List
    • ১০-৮ঃ Detect Cycle in Singly Linked List
  • মডিউল ১১ঃ Problem Solving using Linked list
    • মডিউল ১১-০ঃ সূচনা
    • মডিউল ১১-১ঃ Middle of the Linked List
    • মডিউল ১১-২ঃ Linked List Cycle
    • মডিউল ১১-৩ঃ Remove Duplicate from Sorted List
    • মডিউল ১১-৪ঃ Reverse Linked List
    • মডিউল ১১-৫ঃ Palindrome Linked List
    • মডিউল ১১-৬ঃ Delete Node in a Linked List
  • Module 13: Stack Implementation and STL
    • মডিউল ১৩-০ঃ সূচনা
    • মডিউল ১৩-১ঃ What is stack (animation)
    • মডিউল ১৩-২,৩ঃ What is stack
    • মডিউল ১৩- ৪,৫ঃ Stack Implement using Array
    • মডিউল ১৩-৬ঃ Stack Implement using List
    • মডিউল ১৩-৭ঃ Stack Implement using Doubly Linked List
    • মডিউল ১৩-৮ঃ STL Stack
  • মডিউল ১৪ঃ Queue Implmentation and STL
    • ১৪-০ঃ সূচনা
    • ১৪-১,১৪-২ঃ Queue কী এবং Queue এর কিছু বাস্তব উদাহরণ
    • ১৪-৩ঃ Singly Linked List এর সাহায্যে Queue তৈরি করা
    • ১৪-৪ঃ Doubly Linked List এর সাহায্যে Queue তৈরি করা
    • ১৪-৫ঃ STL List এর সাহায্যে Queue তৈরি করা
    • ১৪-৬ঃ Queue এর STL লাইব্রেরি
    • ১৪-৭ঃImplement Stack using Queue (Leetcode)
    • ১৪-৮ঃ Implement Queue using Stacks (Leetcode)
  • মডিউল ১৫ঃ Problem Solving using Stack & Queue
    • মডিউল ১৫-০ঃ সূচনা
    • মডিউল ১৫-১ঃ Valid Parentheses (Leetcode)
    • মডিউল ১৫-২ঃ Backspace String Compare (Leetcode)
    • মডিউল ১৫-৩ঃ Insert Element At Bottom of Stack (CodingNinjas)
    • মডিউল ১৫-৪ঃ Maximum Equal Stack Sum (CodingNinjas)
    • মডিউল ১৫-৫ঃ Reversing a Queue (CodingNinjas)
    • মডিউল ১৫-৬ঃ Reverse Stack Using Recursion (CodingNinjas)
  • মডিউল ১৭: Binary Tree Implementation
    • মডিউল ১৭-০ঃ সূচনা
    • মডিউল ১৭-১ঃ Discussion about Tree Data Structure
    • মডিউল ১৭-৩ঃ Discussion about Binary Tree
    • মডিউল ১৭- ৪ঃ Create a Binary Tree
    • মডিউল ১৭-৫ঃ Pre Order Traversal of Binary Tree
    • মডিউল ১৭-৭ঃ Post Order Traversal of Binary Tree
    • মডিউল ১৭-৮ঃ In Order Traversal of Binary Tree
  • মডিউল ১৮ঃ Operations On Binary Tree
    • ১৮-০ঃ সূচনা
    • ১৮-১ঃ Level Order Traversal of Binary Tree থিওরি
    • ১৮-২ঃ Level Order Traversal of Binary Tree ইমপ্লিমেন্টেশন
    • ১৮-৩ঃ Binary Tree Input থিওরি
    • ১৮-৪ঃ Binary Tree Input ইমপ্লিমেন্টেশন
    • ১৮-৫ঃ Count Number of Nodes of a Binary Tree
    • ১৮-৬ঃ Count Number of Leaf Nodes of a Binary Tree
    • মডিউল ১৮-৭ঃGet the Maximum Height of a Binary Tree
  • মডিউল ১৯ঃ Problem Solving using Binary Tree
    • মডিউল ১৯-০ঃ সূচনা
    • মডিউল ১৯-১ঃ Is Node Present (Coding Ninjas)
    • মডিউল ১৯-২ঃ STL Pair, Node Level (Coding Ninjas)
    • মডিউল ১৯-৩ঃ Left View Of a Binary Tree (Coding Ninjas)
    • মডিউল ১৯-৪ঃ Diameter Of Binary Tree (Coding Ninjas)
    • মডিউল ১৯-৫ঃ Special Binary Tree (Coding Ninjas)
    • মডিউল ১৯-৬ঃ Reverse Level Order Traversal (Coding Ninjas)
  • মডিউল ২১ঃ Binary Search Tree Implementation
    • মডিউল ২১-০ঃ সূচনা
    • মডিউল ১৭-১ঃ What is BST
    • মডিউল ২১-২ঃ How to Handle Duplicate in BST
    • মডিউল ২১-৩ঃ Search in BST
    • মডিউল ২১-৫ঃ Insert in BST
    • মডিউল ২১-৭ঃ Convert Array to BST
  • মডিউল ২২ঃ Heap Implmentation
    • ২২-০ঃ সূচনা
    • ২২-১ঃ Complete Binary Tree কী
    • ২২-২ঃ Complete Binary Tree এর Array Representation
    • ২২-৩ঃ Heap কী
    • ২২-৪ঃ Heap এ Insertion এর থিওরি
    • ২২-৫ঃ Heap এ Insertion ইমপ্লিমেন্টেশন
    • ২২-৬ঃ Heap এ Deletion থিওরি
    • ২২-৭ঃ Heap এ Deletion ইমপ্লিমেন্টেশন
  • মডিউল ২৩ঃ STL Priority Queue, Map and Set
    • মডিউল ২৩-০ঃ সূচনা
    • মডিউল ২৩-১ঃ Priority Queue কি?
    • মডিউল ২৩-২ঃ কিভাবে STL Priority Queue কাজ করে
    • মডিউল ২৩-৩ঃ Custom Compare Class for Priority Queue
    • মডিউল ২৩-৪ঃ map কি?
    • মডিউল ২৩-৫ঃ কিভাবে STL map কাজ করে
    • মডিউল ২৩-৬ঃ Count Words in a String using Map
    • মডিউল ২৩-৭ঃ কিভাবে STL set কাজ করে
Powered by GitBook
On this page
  1. মডিউল ১৪ঃ Queue Implmentation and STL

১৪-৭ঃImplement Stack using Queue (Leetcode)

Previous১৪-৬ঃ Queue এর STL লাইব্রেরিNext১৪-৮ঃ Implement Queue using Stacks (Leetcode)

Last updated 10 months ago

এই পেজে আমরা Leetcode হতে একটি Interesting প্রবলেম সল্ভ করবো । আমরা Stack এর মডিউলে দেখেছি কীভাবে প্রাইমারী ডাটা স্ট্রাকচার যেমন array , doubly linked list এর সাহায্যে Stack ইমপ্লিমেন্ট করা শিখেছি । এই পেজে আমরা শিখবো , কীভাবে Queue ডাটা স্ট্রাকচার কে ব্যবহার করে Stack ইমপ্লিমেন্ট করা যায়। প্রবলেম লিঙ্কঃ প্রবলেম স্টেট্মেন্ট এ বলা আছে আপনাকে একটি MyStack ক্লাস দেয়া আছে , যেখানে stack এর মেইন মেইন ফাংশন যেমনঃ push , pop , top , empty এই সকল ফাংশন কমপ্লিট করতে হবে। এবং এই ফাংশন গুলা কমপ্লিট করার ক্ষেত্রে Stack এর কোনো concept ব্যবহার করা যাবে না। এই ক্ষেত্রে শুধু মাত্র দুটি queue এর সাহায্যে এই ফাংশন গুলোতে কাজ করতে হবে। আমরা ভাগ ভাগ করে প্রত্যেকটি function নিয়ে আলোচনা করবো ।

  1. push( int x ) : এই ফাংশনে একটি ইন্টিজার x প্যারামিটার হিসেবে পাস করা হবে। এখন চিন্তা করা যাক , যদি একটি stack এ একটি ভ্যালু পুশ করতে বলা হয় তবে সেটি stack এর শেষে insert হয়ে যাবে । আমরা যদি queue তে একটি ভ্যালু পুশ করি , সেক্ষেত্রে ভ্যালুটি queue এর শেষে insert হয়ে যাবে । যেহেতু stack এবং queue এর ক্ষেত্রে এই কাজ টি একই , তাই এক্ষেত্রে queue এর মধ্যে normally ভ্যালু পুশ করে দিলেই হয়ে যাবে ।

  2. pop() : এই ফাংশন স্ট্যাক এর শেষ element টি Remove করে দেয়। এবং সেই ভ্যালুটি প্রিন্ট করে। আমরা জানি , যেহেতু Stack , LIFO ফলো করে তাই , stack এর সর্বশেষে যে ভ্যালুটি insert হয়েছে তা সবার আগে রিমুভ হয়ে যাবে। কিন্তু Queue এর ক্ষেত্রে যে ভ্যালুটি সবার আগে Queue তে এসেছে তা আগে remove হবে । তাই এই pop এর কাজ টি queue তে normal way তে করা যাবে না। সলিউশনঃ এই ক্ষেত্রে আমাদের দুটি Queue এর সাহায্য নিতে হবে । চিন্তা করলে দেখা যায় , একটি Queue Q1 হতে যদি আরেকটি Queue Q2 তে ভ্যালু গুলা একেক করে push করা হয় তবে সেক্ষেত্রে Q1 এবং Q2 উভয় একদম সমান হবে। এই concept টি ব্যবহার করে আমরা একটি কাজ করতে পারি। যেহেতু Queue এর সর্বশেষ ভ্যালুটি stack এর শেষ ভ্যালু। তাই আমরা প্রথম Queue এর শেষ ভ্যালুর আগে পর্যন্ত সব ভ্যালুকে আরেকটি Queue তে Temporarily রাখবো । এবং Original Queue এর শেষ ভ্যালুটি পপ করে দিবো। এরপর Original Queue তে Temporary Queue টি এসাইন করে দিবো । শেষ ভ্যালু কোনটি বুঝার জন্য আমরা queue এর empty ফাংশনের সাহায্য নিবো।

  1. top() : এই ফাংশন টি stack এর সবার উপরের ভ্যালু অর্থাৎ শেষে যে ভ্যালুটি এসেছে তা রিটার্ন করে । যেহেতু Queue এর front ফাংশন ঐ queue তে যে ভ্যালুটি সবার শেষে ঢুকেছে তা রিটার্ন করে , তাই এইক্ষেত্রে সরাসরি Queue এর ফাংশন গুলো দিয়ে এই কাজ টি করা যাবে না Solution: এই ক্ষেত্রে আমরা Queue এর সাহায্যে stack এর pop ইমপ্লিমেন্ট করার যে মেথড টি দেখেছি তার মতো করে একটি temporary queue ক্রিয়েট করে original queue থেকে সব ভ্যালু temporary queue তে পুশ করতে থাকবো। পুশ করতে করতে যখন দেখবো queue এর শেষ element এ এসে গেছি তখন বুঝতে পারবো এই ভ্যালুটি stack এর top ভ্যালু , কারণ এই ভ্যালুটি queue এ সবার শেষে এসেছে। আর সবার শেষের ভ্যালুটি stack এর top ভ্যালু। এই ক্ষেত্রে top value টি কেও আবার temporary queue তে রাখবো, এবং সবশেষে Original Quete তে temporary queue এসাইন করে দিবো।

  2. empty()ঃ এই ফাংশন টি stack টি খালি কিনা তা চেক করবে। stack এবং queue উভয় এর ক্ষেত্রে তারা খালি থাকলে True রিটার্ন করবে। তাই আমরা normally Queue এর সাহায্যে এই কাজটি করে ফেলতে পারবো।

এখন কোড দেখে নেয়া যাক।

Code:

class MyStack
{
public:
    queue<int> q;  // একটি queue নিচ্ছি যা globally সব ফাংশনে ব্যবহার করা যাবে 
    MyStack()
    {
    }

    void push(int x)
    {
        q.push(x); // Stack এবং Queue এর পুশ করা একই। দুটি container এর শেষে ভ্যালু এড হয়
    }

    int pop()
    {
        queue<int> newQ; // আরেকটি Temporary queue নিলাম। যেখানে কিছুক্ষনের জন্য original queue টি স্টোর করে রাখবো 
        int last; // queue এর last ভ্যালু অর্থাৎ stack এর top ভ্যালু রাখার জন্য ভ্যারিয়েবল নিয়ে নিলাম  
        while (!q.empty()) 
        {
            int k = q.front(); // queue এর ভ্যালু গুলা এক এক করে নিয়ে k তে রাখছি
            q.pop(); //  এবং queue থেকে remove করে দিচ্ছি 
            if (q.empty())  // যদি দেখি কারেন্ট ভ্যালুটি queue থেকে বের করে দেয়ার পর queue টি খালি হয়ে গেছে
            {
                // last element
                last = k; // তার মানে সেই ভ্যালুটি হলো queue এর last element 
                break; // এই ক্ষেত্রে আমরা ভ্যালুটি কে temporary queue তে স্টোর করে রাখবো না। অর্থাৎ এটি সরাসরি remove করে দেয়া হয়েছে
            }
            newQ.push(k); // যদি এটি শেষ ভ্যালু না হয়ে থাকে তবে এটি  permanently ডিলিট হবে না তাই  ঐ ভ্যালুটি আমরা temporary queue তে রাখবো 
        }
        q = newQ; // সবশেষে original queue তে temporary queue এর ভ্যালু গুলো আবার রেখে দিবো 
        return last; // সবশেষে সেই ভ্যালুটি রিটার্ন করে দিবো 
    }

    int top()
    {
        queue<int> newQ;
        int last;
        while (!q.empty())
        {
            int k = q.front();
            q.pop();
            if (q.empty())
            {
                // last element
                last = k;
            } // pop ফাংশনের মতো সবকিছু একই এই ফাংশনে শুধু মাত্র এখানে ভিন্নতা আছে।
            // যেহেতু top() ফাংশন শুধুমাত্র স্ট্যাকের উপরের ভ্যালুটি এক্সেস করে তা ডিলিট করে দেয় না, এই ক্ষেত্রে আমরা শেষ ভ্যালুটি কে delete করবো না। তাই এইক্ষেত্রে সেই ভ্যালুটিও temporay queue তে রেখেছি।   
            newQ.push(k);
        }
        q = newQ;
        return last;
    }

    bool empty()
    {
        return q.empty(); // queue খালি কিনা চেক করছি। 
    }
};
https://leetcode.com/problems/implement-stack-using-queues/description/
Drawing