200 likes | 406 Views
Стек та черга у C#. Узагальнююче повторення. Підготовка до проведення практичних робіт “Використання стеку” та “Робота з чергою”. Які основні методи по роботі зі стеком?. Як працювати з елементами стека - як додати елемент у стек і як вилучити елемент з стека?
E N D
Стек та черга у C# Узагальнююче повторення. Підготовка до проведення практичних робіт “Використаннястеку” та “Робота з чергою”
Які основні методи по роботі зі стеком? Як працювати з елементами стека - як додати елемент у стек і як вилучити елемент з стека? При цьому варто пам'ятати про те, що додається елемент завжди в вершину стека і вилучається також із вершини, тому для того, щоб додати / вилучити елемент, не потрібно вказувати його місце розташування (індекс).
Створення стека Стек створюється за допомогою наступного конструктора: StackmyStack = newStack (); У дужках можна вказати початкову довжину стека: StackmyStack = newStack (10); Створили стек з довжиною рівною 10, якщо додамо в нього більше елементів, то довжина зміниться автоматично.
Основні операції (методи)роботи із стеком: Push(елемент); - додає заданий елемент у стек Peek(); - повертає елемент, що знаходиться у вершині стека Pop (); - повертає елемент, що знаходиться у вершині стека, видаляючи при цьому його зі стека
Додаванняелементів у стек Щобдодатиелемент у стек, потрібновикликати метод Push, передавши йому як параметр добавляемое значення. Приклад: Stack myStack = new Stack(); myStack.Push(“Каждый”); myStack.Push(“Охотник”); myStack.Push(“Желает”); myStack.Push(“Знать”); myStack.Push(“Где”); myStack.Push(“Сидит”); myStack.Push(“Фазан”); У стек можнадодатипорожнійелемент, передавши методу Push значенняNULL.
Витягелементівз стека Для добуванняелементівзі стеку використовується метод Pop. Цей метод добуваєзі стеку один елемент: Console.WriteLine (myStack.Pop ()); При спробівитягтиелементз пустого стека виникаєвиключення. Тому потрібнопередбачитиобробниквиключень. Для контролю поточного розміру стека використовується метод Count myStack.Count ();
Перевіркавмістуверхівки стека Метод Peekдозволяєподивитисявмістверхівки стека, не витягуючиелементз стека. Console.WriteLine (myStack.Peek ());
Перегляд вмісту стека за допомогою ітератора Вміст стека можна подивитися за допомогою ітератора класу IEnumerator Приклад: IEnumeratormyEnumerator = myStack.GetEnumerator (); while (myEnumerator.MoveNext ()) { Console.WriteLine ("{0}", myEnumerator.Current); } Слід звернути увагу на те, що елементи виведуться не в порядку додавання а в зворотному. Перегляд стека за допомогою ітератора не змінює вмісту стека.
Вилученняелементів Для вилученнявсіхелементівз стека призначений метод Clear. Видаленняокремихелементівможливотількипід час їхвидобуванняз стека методом Pop.
Приклад роботи із стеком Stack myStack= new Stack(); myStack.Push("Каждый"); myStack.Push("Охотник"); myStack.Push("Желает"); myStack.Push("Знать"); myStack.Push("Где"); myStack.Push("Сидит"); myStack.Push("Фазан"); Console.WriteLine("Всього в стеку {0} елементiв", myStack.Count); IEnumeratormyEnumerator = myStack.GetEnumerator(); while (myEnumerator.MoveNext()) { Console.WriteLine("{0}", myEnumerator.Current); } Console.WriteLine("Перший елемент: myStack.Peek ()"); Console.WriteLine("Витягуємо один елемент: {0}", myStack.Pop()); Console.WriteLine("Витягуємонаступнийелемент: {0}", myStack.Pop()); Console.WriteLine("У стецiзалишилося {0} елементiв", myStack.Count); IEnumerator myEnumerator1 = myStack.GetEnumerator(); while (myEnumerator1.MoveNext()) { Console.WriteLine("{0}", myEnumerator1.Current); } Console.ReadLine();
Приклад роботи із стеком usingSystem.Collections; namespace ConsoleApplication1 { classProgram { staticvoidMain(string[] args) { Stackst = newStack(); st.Push("Перше слово"); st.Push("Друге слово"); st.Push("Третє слово"); Console.WriteLine(st.Pop()); // вивід головного елемента стека "Третє слово" та його видалення з стека // в голову стека стане друге слово Console.WriteLine(st.Peek()); // вивід наступного головного елемента стека - вивід елемента "Друге слово" при цьому слово залишається у стеку Console.WriteLine(st.Pop()); //вивід елемента "Друге слово" та його видалення з стека Console.WriteLine(st.Pop()); //вивід елемента "Перше слово" та його видалення з стека – стек стає порожнім Try { Console.WriteLine (st.Pop ()); // намагаємося вивести та видалити елемент зі стеку, коли стек вже порожній } catch (Exception e) { Console.WriteLine (e.Message); // виводимо повідомлення про помилку } } } }
Основні операції з чергою Основні операції з чергою - додавання елемента і видалення елемента. Методи мови C#, що дозволяють здійснювати ці операції. Enqueue (елемент); - додає заданий елемент у чергу Peek (); - повертає елемент, що знаходиться першим у черзі Dequeue (); - повертає елемент, що знаходиться першим у черзі і видаляє його з черги
Для розуміння того, що означає кожен із перелічених методів, можна скористатися наступною ілюстрацією. Нехай ми є продавцем і власником магазину. Тоді, якщо до нас в магазин хтось заходить і хоче щось купити, то ми його додаємо в чергу методом Enqueue. Якщо ми в даний момент нікого не обслуговуємо або тільки що закінчили обслуговувати покупця і збираємося обслуговувати наступного, то ми викликаємо метод Dequeue, отримуючи, таким чином, наступного покупця. Якщо ж нам потрібно подивитися, хто стоїть наступним у черзі, то ми скористаємося методом Peek, тому при цьому (подивившись наступного покупця) ми нікого не обслужили.
Прикладроботи з чергою.Визначаємо клас «Покупець»: class Buyer { string fio { get; set; } public Buyer(string fio) { this.fio = fio; } public override string ToString() { return fio; } }
У методі Main пишемо наступний код: Queue<Buyer> queue = newQueue<Buyer>(); Console.WriteLine("До нас приходять покупці: Покупець 1, Покупець 2, Покупець 3"); queue.Enqueue(newBuyer("Покупець 1")); queue.Enqueue(newBuyer("Покупець 2")); queue.Enqueue(newBuyer("Покупець 3")); Console.WriteLine("Починаємо обслуговування покупців"); Console.WriteLine("Обслуговуємо:" + queue.Dequeue()); Console.WriteLine("А наступним буде" + queue.Peek()); Console.WriteLine("Завершили обслуговування, починаємо обслуговувати" + queue.Dequeue()); Console.WriteLine("А наступним буде" + queue.Peek()); Console.WriteLine("Завершили обслуговування, починаємо обслуговувати" + queue.Dequeue());
Застосування стандартної властивості Count для отримання кількості елементів: Queue<Buyer> queue = newQueue<Buyer>(); Console.WriteLine("До нас приходять покупці: Покупець 1, Покупець 2, Покупець 3"); queue.Enqueue(newBuyer("Покупець 1")); queue.Enqueue(newBuyer("Покупець 2")); queue.Enqueue(newBuyer("Покупець 3")); Console.WriteLine("Починаємо обслуговування покупців "); Console.WriteLine("Обслуговуємо: " + queue.Dequeue()); while (queue.Count > 0) //поки номер черги більший 0 { Console.WriteLine("А наступним буде " + queue.Peek()); Console.WriteLine("Завершили обслуговування, починаємо обслуговувати " + queue.Dequeue()); } Console.WriteLine("Ура! Всіх обслужили.");
Queue<Buyer> queue = new Queue<Buyer>(); Console.WriteLine("Учнiздають залiк по черзi: Козак, Петренко, Чуб "); queue.Enqueue(new Buyer("Козак")); queue.Enqueue(new Buyer("Петренко")); queue.Enqueue(new Buyer("Чуб")); Console.WriteLine("Починаємоздавати залiк "); Console.WriteLine("Слухаємо: " + queue.Dequeue()); Console.WriteLine("Наступнимздає " + queue.Peek()); Console.WriteLine("Залiк здано, чергаздавати залiк " + queue.Dequeue()); Console.WriteLine("А наступним буде " + queue.Peek()); Console.WriteLine("вислухали, починаєздавати залiк "+queue.Dequeue());