Stack<T> ক্লাসের কনস্ট্রাক্টর Stack(IEnumerable<T> collection) ব্যবহার করে যেকোনো সংগ্রহ থেকে একটি নতুন Stack তৈরি করা যায়। উপাদানগুলো সংগ্রহের এনুমারেশন অর্ডারে স্টকে পুশ হয় (সর্বশেষ উপাদান টপে থাকে)।
উদাহরণ ১: ইন্টিজার Stack থেকে অ্যারে経由 নতুন Stack তৈরি
using System;
using System.Collections.Generic;
public class Demo {
public static void Main() {
Stack<int> stack = new Stack<int>();
stack.Push(100);
stack.Push(200);
stack.Push(300);
stack.Push(400);
stack.Push(500);
stack.Push(600);
stack.Push(700);
stack.Push(800);
stack.Push(900);
stack.Push(1000);
Console.WriteLine("মূল Stack উপাদানসমূহ (টপ থেকে বটম)...");
foreach (int val in stack) {
Console.WriteLine(val);
}
// Stack.ToArray() -> অ্যারে (বটম থেকে টপ অর্ডার)
// তারপর অ্যারে থেকে নতুন Stack তৈরি
Console.WriteLine("\nঅ্যারে উপাদানসমূহ (বটম থেকে টপ)...");
Stack<int> arr = new Stack<int>(stack.ToArray());
foreach (int val in arr) {
Console.WriteLine(val);
}
}
}
আউটপুট
মূল Stack উপাদানসমূহ (টপ থেকে বটম)... 1000 900 800 700 600 500 400 300 200 100 অ্যারে উপাদানসমূহ (বটম থেকে টপ)... 100 200 300 400 500 600 700 800 900 1000
উদাহরণ ২: স্ট্রিং Stack থেকে নতুন Stack তৈরি
using System;
using System.Collections.Generic;
public class Demo {
public static void Main() {
Stack<string> stack = new Stack<string>();
stack.Push("ক্যাটি");
stack.Push("এন্ডি");
stack.Push("অ্যারিন");
stack.Push("জাস্টিন");
Console.WriteLine("মূল Stack উপাদানসমূহ (টপ থেকে বটম)...");
foreach (string val in stack) {
Console.WriteLine(val);
}
Console.WriteLine("\nঅ্যারে উপাদানসমূহ (বটম থেকে টপ)...");
Stack<string> arr = new Stack<string>(stack.ToArray());
foreach (string val in arr) {
Console.WriteLine(val);
}
}
}
আউটপুট
মূল Stack উপাদানসমূহ (টপ থেকে বটম)... জাস্টিন অ্যারিন এন্ডি ক্যাটি অ্যারে উপাদানসমূহ (বটম থেকে টপ)... ক্যাটি এন্ডি অ্যারিন জাস্টিন
গুরুত্বপূর্ণ পর্যবেক্ষণ: অর্ডার রিভার্সাল
Stack LIFO (Last In First Out) ডেটা স্ট্রাকচার। stack.ToArray() বটম-টু-টপ অর্ডারে অ্যারে রিটার্ন করে। এই অ্যারে দিয়ে নতুন Stack(arr) তৈরি করলে অ্যারের প্রথম উপাদান (পুরনো স্টকের বটম) নতুন স্টকের বটমে যায়, এবং অ্যারের শেষ উপাদান (পুরনো স্টকের টপ) নতুন স্টকের টপে থাকে। ফলে নতুন স্টকের এনুমারেশন অর্ডার (টপ-টু-বটম) পুরনো স্টকের সমান হয়।
// ভিজ্যুয়ালাইজেশন:
পুরনো Stack (টপ→বটম): 1000, 900, 800, ..., 100
ToArray() (বটম→টপ): [100, 200, 300, ..., 1000]
নতুন Stack(অ্যারে) (টপ→বটম): 1000, 900, 800, ..., 100 ← সমান অর্ডার!
Stack কনস্ট্রাক্টর ওভারলোডসমূহ
// ১. ডিফল্ট (খালি)
new Stack<T>()
// ২. নির্দিষ্ট ক্যাপাসিটি
new Stack<T>(int capacity)
// ৩. অন্য সংগ্রহ থেকে (এই আর্টিকেলের বিষয়)
new Stack<T>(IEnumerable<T> collection)
অন্য সংগ্রহ থেকে Stack তৈরি - উদাহরণ
// List থেকে Stack
var list = new List<int> { 1, 2, 3, 4, 5 };
var stackFromList = new Stack<int>(list); // টপ: 5, বটম: 1
// Array থেকে Stack
int[] arr = { 10, 20, 30 };
var stackFromArray = new Stack<int>(arr); // টপ: 30, বটম: 10
// Queue থেকে Stack
var queue = new Queue<int>();
queue.Enqueue(1); queue.Enqueue(2); queue.Enqueue(3);
var stackFromQueue = new Stack<int>(queue); // টপ: 3, বটম: 1 (FIFO অর্ডার)
// LINQ কোয়েরি থেকে Stack
var stackFromQuery = new Stack<int>(Enumerable.Range(1, 5).Reverse()); // টপ: 1
Stack-র মূল মেথডসমূহ
| মেথড | বিবরণ | সময় জটিলতা |
|---|---|---|
Push(T item) | টপে উপাদান যোগ করে | O(1) амর্টাইজড |
Pop() | টপ থেকে উপাদান সরিয়ে রিটার্ন | O(1) |
Peek() | টপ উপাদান দেখে (সরায় না) | O(1) |
Contains(T item) | উপাদান আছে কিনা চেক | O(n) |
Clear() | সব উপাদান সরায় | O(n) |
ToArray() | অ্যারে হিসেবে কপি রিটার্ন | O(n) |
ব্যবহার ক্ষেত্র (Use Cases)
- অনডো/রিডো: অপারেশন 히স্টরি রাখা
- ব্যাকট্র্যাকিং অ্যালগরিদম: মেজ সলভিং, পার্সিং
- ফাংশন কল স্ট্যাক সিমুলেশন: রিকার্শন টু ইটেরেশন কনভার্শন
- এক্সপ্রেশন ইভ্যালুয়েশন: পোস্টফিক্স/প্রিফিক্স ক্যালকুলেশন
- ব্রাউজার হিস্টরি: ব্যাক/ফরোয়ার্ড নেভিগেশন
নোট: Stack<T> জেনেরিক ক্লাস (System.Collections.Generic)। নন-জেনেরিক Stack (System.Collections) লিগ্যাসি, নতুন কোডে বাদ দিন।