C# стек із прикладами Push & Pop
⚡ Розумний підсумок
Stack у C# — це колекція з простору імен System.Collections, яка дотримується принципу LIFO (останній прийшов, перший вийшов), де метод Push додає елемент зверху, а метод Pop видаляє його.
Що таке стек у C#?
Стек — це колекція спеціальних випадків, яка представляє концепцію LIFO (останній прийшов, перший вийшов). Щоб спочатку зрозуміти LIFO, розглянемо приклад. Уявіть собі стопку книг, кожна з яких лежить одна на одній.
Концепція «останньою прийшла першою» у випадку книг означає, що зі стосу книг можна видалити лише найвищу книгу. Неможливо видалити книгу з-поміж них, оскільки тоді це порушить налаштування стека.
Звідси і в C#, стек також працює таким же чином. Елементи додаються в стек один над одним. Процес додавання елемента в стек називається операцією push. Щоб видалити елемент зі стеку, ви також можете видалити самий верхній елемент стека. Ця операція відома як pop.
Давайте детальніше розглянемо операції, доступні для колекції Stack.
Оголошення стека
Стек створюється за допомогою типу даних стека. Ключове слово «новий» використовується для створення об’єкта стека. Потім об’єкт призначається змінній st.
Stack st = new Stack()
Додавання елементів у стек
Метод push використовується для додавання елемента в стек. Загальний синтаксис оператора наведено нижче.
Stack.push(element)
Видалення елементів зі стека
Метод pop використовується для видалення елемента зі стека. Операція pop повертає найвищий елемент стека. Загальний синтаксис оператора наведено нижче
Stack.pop()
Рахувати
Ця властивість використовується для отримання кількості елементів у стеку. Нижче наведено загальний синтаксис цього оператора.
Stack.Count
Містить
Цей метод використовується, щоб побачити, чи присутній елемент у стеку. Нижче наведено загальний синтаксис цього оператора. Оператор поверне значення true, якщо елемент існує, інакше він поверне значення false.
Stack.Contains(element)
Тепер давайте подивимося, як це працює на рівні коду. Весь наведений нижче код буде записано в наш Консольний додаток. Код буде записаний у наш файл Program.cs.
У наведеній нижче програмі ми напишемо код, щоб побачити, як ми можемо використовувати вищезгадані методи.
Приклад 1: метод Stack.Push().
На цьому прикладі ми побачимо
- Як створюється стек.
- Як відобразити елементи стека та використовувати методи Count і Contain.
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DemoApplication { class Program { static void Main(string[] args) { Stack st = new Stack(); st.Push(1); st.Push(2); st.Push(3); foreach (Object obj in st) { Console.WriteLine(obj); } Console.WriteLine(); Console.WriteLine(); Console.WriteLine("The number of elements in the stack " +st.Count); Console.WriteLine("Does the stack contain the elements 3 "+st.Contains(3)); Console.ReadKey(); } } }
Code Пояснення:
- Перший крок використовується для оголошення стека. Тут ми оголошуємо «st» як змінну для зберігання елементів нашого стеку.
- Далі ми додаємо 3 елементи в наш стек. Кожен елемент додається за допомогою методу Push.
- Тепер, оскільки до елементів стека неможливо отримати доступ через позицію індексу, як список масивів, нам потрібно використовувати інший підхід для відображення елементів стека. Об’єкт (obj) — це тимчасова змінна, яка оголошена для зберігання кожного елемента стеку. Потім ми використовуємо оператор foreach для проходження кожного елемента стеку. Для кожного елемента стека значення присвоюється змінній obj. Потім ми використовуємо команду Console.Writeline, щоб відобразити значення на консолі.
- Ми використовуємо властивість Count (ст.кол), щоб отримати кількість елементів у стеку. Ця властивість повертає число. Потім ми виводимо це значення на консоль.
- Потім ми використовуємо метод Contains, щоб перевірити, чи присутнє значення 3 у нашому стеку. Це поверне значення true або false. Потім ми виводимо це повернуте значення на консоль.
Якщо наведений вище код введено належним чином і програма запущена, буде показано наступний результат.
вихід:
З результату ми бачимо, що відображаються елементи стека. Крім того, значення True відображається, щоб сказати, що значення 3 визначено в стеку.
Примітка:: Ви помітили, що останній елемент, вставлений у стек, відображається першим. Це самий верхній елемент стека. Кількість елементів стека також відображається у виведених даних.
Приклад 2: метод Stack.Pop().
Тепер давайте розглянемо функцію «видалити». Ми побачимо код, необхідний для видалення самого верхнього елемента зі стеку.
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DemoApplication { class Program { static void Main(string[] args) { Stack st = new Stack(); st.Push(1); st.Push(2); st.Push(3); st.Pop(); foreach (Object obj in st) { Console.WriteLine(obj); } Console.ReadKey(); } } }
Code Пояснення:
- Тут ми просто запускаємо метод pop, який використовується для видалення елемента зі стеку.
Якщо наведений вище код введено належним чином і програма запущена, буде показано наступний вихід.
вихід:
Ми бачимо, що елемент 3 видалено зі стеку.
Метод C# Stack Peek()
Методи Push та Pop працюють з вершиною стеку, але іноді потрібно лише подивитися на верхній елемент, не видаляючи його. Метод Peek робить саме це. Він повертає найвище значення стеку, залишаючи колекцію незмінною, що корисно, коли ви хочете перевірити наступний елемент, перш ніж вирішити його витягнути.
Крок 1) Створіть стек і помістіть на нього три елементи так, щоб значення 3 розташовувалося зверху.
Крок 2) Викличте метод Peek, щоб прочитати верхній елемент, а потім перевірте властивість Count, щоб переконатися, що нічого не було видалено.
using System; using System.Collections; namespace DemoApplication { class Program { static void Main(string[] args) { Stack st = new Stack(); st.Push(1); st.Push(2); st.Push(3); Console.WriteLine(st.Peek()); Console.WriteLine(st.Count); Console.ReadKey(); } } }
Code Пояснення:
- Оголошується стек з іменем st, а значення 1, 2 та 3 додаються за допомогою методу Push, таким чином 3 стає найвищим елементом.
- Метод Peek повертає верхній елемент, не видаляючи його, а властивість Count все одно повідомляє повну кількість елементів у стеку.
Коли програма виконується, вона друкує значення 3 від Peek, а потім відліку 3, що доводить, що елемент залишається в стеку. Якщо стек порожній, Peek викидає помилку InvalidOperationException, тому безпечно перевірити Count перед його викликом.
Загальний стек у C#
У наведених вище прикладах використовується неузагальнений клас Stack з System.Collections, який зберігає кожен елемент як об'єкт. Сучасний код C# зазвичай надає перевагу узагальненому класу Stack. клас з простору імен System.Collections.Generic. Він прив'язує стек до одного оголошеного типу, тому компілятор перевіряє кожне Push та Pop, і жодного перетворення чи упаковки не потрібно.
Основні переваги генеричного Stack перелічені нижче.
- Безпека типу: Тип фіксується під час оголошення, тому можна передавати лише значення цього типу, а помилки перехоплюються під час компіляції.
- Без боксу: Типи значень, такі як int, зберігаються безпосередньо, що дозволяє уникнути витрат на упаковку, які сплачує неузагальнений стек.
- Прибиральник читає: Pop та Peek повертають оголошений тип безпосередньо, тому ви не перетворюєте результат назад з об'єкта.
using System; using System.Collections.Generic; namespace DemoApplication { class Program { static void Main(string[] args) { Stack<string> st = new Stack<string>(); st.Push("Java"); st.Push("Python"); Console.WriteLine(st.Pop()); Console.ReadKey(); } } }
У цьому прикладі стек оголошено як Stack , тому він приймає лише рядкові значення. Метод Pop повертає рядок безпосередньо та друкує Python, останнє надіслане значення. Для будь-якого нового проекту, загальний Stack є рекомендованим вибором.
Різниця між стеком та чергою в C#
Стек і чергу – це обидві колекції, які контролюють порядок видалення елементів, але використовують протилежні правила. Стек діє за принципом «останнім прийшов — першим вийшов», тоді як черга діє за принципом «першим прийшов — першим вийшов». Вибір правильної колекції робить намір вашого коду зрозумілим для інших розробників.
Основні відмінності перелічені нижче:
- замовлення: Стек спочатку видаляє останній доданий елемент (LIFO), тоді як черга спочатку видаляє найстаріший елемент (FIFO).
- методи: Стек використовує Push та Pop, тоді як черга використовує Enqueue для додавання та Dequeue для видалення.
- Доступ до верхнього елемента: Стек зчитує наступний елемент за допомогою Peek, а черга зчитує наступний елемент за допомогою Peek спереду.
- Типове використання: Стеки підходять для функцій скасування, обчислення виразів та рекурсії tracкороль, тоді як черги підходять для планування, буферизації та обходу в ширину.
Обидва типи доступні в загальному вигляді як Stack і черга у System.Collections.Generic, тому ви отримуєте безпеку типів з будь-яким варіантом.





