با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، با دوره کامل آموزش #C در خدمت شما دوستان هستیم . در قسمت قبلی در مورد مجموعه های SortedList در زبان #C صحبت کرده و متد ها و پراپرتی های آن را نام برده و توضیح دادیم. در این قسمت قصد داریم شما را با نوعی دیگر از مجموعه های غیر عمومی به نام پشته در #C شامل (متد Push ، متد Peek ، متد Contains ، متد Clear ) آشنا کنیم.
این نوع از مجموعه ها عناصر را در سبک LIFO) Last In First Out) ذخیره می کنند. زبان #C شامل دو نوع پشته عمومی و غیر عمومی است.
در اینجا، شما در مورد پشته غیر عمومی خواهید آموخت.
میتوان در پشته از مقدار صفر و همچنین تکراری اسفاده کرد . در یک پشته متد Push برای اضافه کردن یک مقدار و متد Pop یا Peek برای بازیابی مقادیر استفاده می شوند.
توضیحات | پراپرتی |
تعداد کل عناصر موجود در پشته را برمی گرداند. | Count |
توضیحات | متد |
اضافه کردن یک عنصر به بالای پشته | Push |
برگرداندن بالاترین عنصر پشته | Peek |
پاک کردن و برگرداندن (Cut) بالاترین عنصر پشته | Pop |
چک کردن اینکه آیا عنصر مورد نظری در پشته موجود هست یا خیر | Contains |
پاک کردن تمام عناصر موجود در پشته | Clear |
متد Push مقادیر را به پشته اضافه می کند مقادیر میتواند از هر نوع داده ای باشند.
1 2 3 4 5 6 7 8 | Stack myStack = new Stack(); myStack.Push("Hello!!"); myStack.Push(null); myStack.Push(1); myStack.Push(2); myStack.Push(3); myStack.Push(4); myStack.Push(5); |
شما می توانید عناصر پشته را با روش های مختلف بازیابی کنید. میتوانید با استفاده از foreach تمام عناصر را به سبک LIFO دریافت کنید.
1 2 3 4 5 6 7 8 9 10 11 | Stack myStack = new Stack(); myStack.Push("Hello!!"); myStack.Push(null); myStack.Push(1); myStack.Push(2); myStack.Push(3); myStack.Push(4); myStack.Push(5); foreach (var itm in myStack) Console.Write(itm); |
خروجی :
1 2 3 4 5 6 7 | 5 4 3 2 1 Hello!! |
متد Peek آخرین مقدار (top-most) را از پشته باز می گرداند. اگر پشته خالی باشد خطای InvalidOperationException بازگشت داده می شود . بنابراین قبل از بازیابی عناصر با استفاده از متد Peek حتما پشته را بررسی کنید.
1 2 3 4 5 6 7 8 9 10 | Stack myStack = new Stack(); myStack.Push(1); myStack.Push(2); myStack.Push(3); myStack.Push(4); myStack.Push(5); Console.WriteLine(myStack.Peek()); Console.WriteLine(myStack.Peek()); Console.WriteLine(myStack.Peek()); |
خروجی :
1 2 3 | 5 5 5 |
می توانید با استفاده از متد Pop مقادیر را بازیابی کنید ؛ متد Pop آخرین مقدار را برگردانده و سپس آن را پاک می کند.
متد Pop در یک پشته خالی، خطای InvalidOperationException را برمی گرداند. بنابراین همیشه برای استفاده از متد Pop باید تعداد عناصر پشته بیش از ۰ باشد.
شکل کلی :
object Pop();
1 2 3 4 5 6 7 8 9 10 11 12 13 | Stack myStack = new Stack(); myStack.Push(1); myStack.Push(2); myStack.Push(3); myStack.Push(4); myStack.Push(5); Console.Write("Number of elements in Stack: {0}", myStack.Count); while (myStack.Count > 0) Console.WriteLine(myStack.Pop()); Console.Write("Number of elements in Stack: {0}", myStack.Count); |
خروجی :
1 2 3 4 5 6 7 | Number of elements in Stack: 5 5 4 3 2 1 Number of elements in Stack: 0 |
متد Contains بررسی می کند که آیا عنصر مشخص شده در مجموعه پشته وجود دارد یا نه. اگر وجود داشته باشد، true را برمی گرداند؛ در غير اينصورت، مقدار false را برمیگرداند.
شکل کلی :
bool Contains(object obj);
1 2 3 4 5 6 7 8 9 | Stack myStack = new Stack(); myStack.Push(1); myStack.Push(2); myStack.Push(3); myStack.Push(4); myStack.Push(5); myStack.Contains(2); // returns true myStack.Contains(10); // returns false |
این متد تمام عناصر موجود در پشته را حذف می کند :
شکل کلی :
void Clear();
1 2 3 4 5 6 7 8 9 10 | Stack myStack = new Stack(); myStack.Push(1); myStack.Push(2); myStack.Push(3); myStack.Push(4); myStack.Push(5); myStack.Clear(); // removes all elements Console.Write("Number of elements in Stack: {0}", myStack.Count); |
خروجی :
1 | Number of elements in Stack: 0 |
در این قسمت با نوعی دیگر از مجموعه های غیر عمومی در زبان #C آشنا شدید.
در قسمت بعد به معرفی و تشریح صف (Queue) که از مجموعه های غیر عمومی (Non Generic) در زبان #C است می پردازیم.
زهرا
ممنون از توضیحتون میخواستم بپرسم از stack ها در چه مواردی استفاده میشه؟ میشه یه مثال بزنید؟
صادق
در دنیای برنامه نویسی از استک بیشتر در کامپایلر ها استفاده میشه. مثل ارزیابی عبارات، پردازش رشته ها، پردازش نحو (syntax) زبان، فراخوانی توابع و … . در برنامه نویسی کاربردی خیلی استفاده نمیشه مگر توی پیاده سازی الگوریتم های خاص.
مریم
سلام چطوری میتونه تابع توان دارو با پشته محاسبه کنم ؟
کاربر
در قسمتی گفتید که انواع داده رو میتونیم در پشته ذخیره کنیم اما در سیشارپ نتونستم کدی که زدید استفاده کنم، ارور میده و باید یک تایپ برای مقادیر پشته تعیین کنم
صادق
بله این قسمت اشتباه شده و در سریعترین زمان ممکن آپدیت میشه. هر شئ استک فقط می تونه یک نوع داده رو در خودش ذخیره کنه که این نوع داده هنگام تعریف کردن شئ مشخص میشه. (باید از general programming) استفاده کنیم. به مثال توجه کنید:
Stack<string> myStack1 = new Stack<string>();
البته برای این که چندین نوع رو در استک (یا هر کالکشن دیگری مثل لیست ها) استفاده کنید، می تونید از شئ Object به جای string (در کد بالا) استفاده کنید. تمامی کلاس ها در سی شارپ به طور پیش فرض از کلاس Object ارث بری می کنند. به همین دلیل اگر از این نوع داده استفاده کنیم، در واقع می توانیم هر نوع داده ای را تعریف کنیم.