"Використання стеку” та "Робота з чергою”

Download Report

Transcript "Використання стеку” та "Робота з чергою”

Стек та черга у C#
УЗАГАЛЬНЮЮЧЕ ПОВТОРЕННЯ.
ПІДГОТОВКА ДО ПРОВЕДЕННЯ ПРАКТИЧНИХ РОБІТ
“ВИКОРИСТАННЯ СТЕКУ” ТА “РОБОТА З ЧЕРГОЮ”
Які основні методи по роботі зі стеком?
Як працювати з елементами стека - як додати
елемент у стек і як вилучити елемент з стека?
При цьому варто пам'ятати про те, що додається
елемент завжди в вершину стека і вилучається
також із вершини, тому для того, щоб додати /
вилучити елемент, не потрібно вказувати
його місце розташування (індекс).
Створення стека
Стек створюється за допомогою наступного
конструктора:
Stack myStack = new Stack ();
У дужках можна вказати початкову довжину стека:
Stack myStack = new Stack (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
Приклад:
IEnumerator myEnumerator =
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);
IEnumerator myEnumerator = 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();
using System.Collections;
Приклад роботи із
namespace ConsoleApplication1
стеком
{
class Program
{
static void Main(string[] args)
{
Stack st = new Stack();
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 = new Queue<Buyer>();
Console.WriteLine("До нас приходять покупці: Покупець 1,
Покупець 2, Покупець 3");
queue.Enqueue(new Buyer("Покупець 1"));
queue.Enqueue(new Buyer("Покупець 2"));
queue.Enqueue(new Buyer("Покупець 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 = new Queue<Buyer>();
Console.WriteLine("До нас приходять покупці: Покупець 1,
Покупець 2, Покупець 3");
queue.Enqueue(new Buyer("Покупець 1"));
queue.Enqueue(new Buyer("Покупець 2"));
queue.Enqueue(new Buyer("Покупець 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());