
Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра безопасности информационных систем (БИС)
СТЕКИ И ОЧЕРЕДИ
Отчет по практической работе №4
по дисциплине «Структуры данных»
Студент гр. 733-1
_______ Сметанников Д.Е
_______
Принял:
преподаватель КИБЭВС
_______ Д.Р. Уразаев
_______
Задание
Реализовать на базе классов из практики 3 работу с очередью и со стеком.
Продемонстрировать типовые функции работы со стеком: -
удалить из стека - возвращать удаляемый элемент возвращается по результату работы метода,
добавить в стек,
число элементов стека,
взять верхний элемент стека без удаления.
Очередь:
число элементов в очереди,
удалить из очереди
добавить в очередь.
получить первый элемент из очереди без удаления из нее.
Содержание
Задание 2
1 Введение 4
2 Ход работы 5
Заключение 9
Приложение А 10
Введение
Целью данной работы является реализация классов для работы со стеком и очередью на основе ранее изученных концепций.
Ход работы
Push: Добавляет элемент на верхушку стека. Если стек был пуст, новый элемент становится и верхом, и основанием стека (рис.1)
Рисунок 1 — push
Pop: Удаляет и возвращает верхний элемент стека. Если стек пуст, вызывает ошибку. При удалении верхнего элемента обновляется указатель на верх (рис. 2)
Рисунок 2 — pop
Peek: Возвращает верхний элемент стека без его удаления. Если стек пуст, вызывает ошибку (рис. 3)
Рисунок 3 — peek
Count: Возвращает количество элементов в стеке. Считывает их, проходя по всем элементам, начиная с верхнего (рис. 4)
Рисунок 4 — count
PrintStack: Выводит все элементы стека в порядке от верхнего к нижнему. Позволяет визуализировать текущие элементы стека (рис. 5)
Рисунок 5 — printstack
Enqueue: Добавляет элемент в конец очереди. Если очередь была пустой, новый элемент становится и первым, и последним (рис. 6)
Рисунок 6 — enqueue
Dequeue: Удаляет и возвращает первый элемент очереди. Если очередь пуста, вызывает ошибку. Обновляет указатель на первый элемент после удаления (рис. 7)
Рисунок 7 - Dequeue
PeekFront: Возвращает первый элемент очереди без его удаления. Если очередь пуста, вызывает ошибку (рис. 8)
Рисунок 8 — peekfront
Count: Возвращает количество элементов в очереди. Считывает их, проходя от первого до последнего элемента (рис. 9)
Рисунок 9 — count
PrintQueue: Выводит все элементы очереди в порядке от первого к последнему. Позволяет вывести текущие элементы очереди (рис. 10)
Рисунок 10 — printqueue
Заключение
В ходе работы были успешно реализованы функциональные классы для стека и очереди. Мы продемонстрировали типовые операции, включая добавление и удаление элементов, а также получение значений без удаления.
Приложение а
(обязательное)
Код
using System;
class Node
{
public int Value;
public Node Next;
public Node(int value)
{
Value = value;
Next = null;
}
}
class MyList
{
protected Node head;
protected Node tail;
public MyList()
{
head = null;
tail = null;
}
public bool Add(int element)
{
Node newNode = new Node(element);
if (head == null)
{
head = newNode;
tail = newNode;
tail.Next = head;
}
else
{
tail.Next = newNode;
tail = newNode;
tail.Next = head;
}
return true;
}
public bool RemoveItem(int element)
{
if (head == null)
{
return false;
}
Node current = head;
Node previous = null;
do
{
if (current.Value == element)
{
if (previous == null)
{
if (head == tail)
{
head = null;
tail = null;
}
else
{
head = head.Next;
tail.Next = head;
}
}
else
{
previous.Next = current.Next;
if (current == tail)
{
tail = previous;
}
}
return true;
}
previous = current;
current = current.Next;
} while (current != head);
return false;
}
public bool Clear()
{
if (head == null)
{
return false;
}
head = null;
tail = null;
return true;
}
public bool Search(int element)
{
if (head == null)
{
return false;
}
Node current = head;
do
{
if (current.Value == element)
{
return true;
}
current = current.Next;
} while (current != head);
return false;
}
public void PrintList()
{
if (head == null)
{
Console.WriteLine("Список пуст.");
return;
}
Node current = head;
do
{
Console.Write(current.Value + " ");
current = current.Next;
} while (current != head);
Console.WriteLine();
}
public void RemoveEven()
{
if (head == null)
{
return;
}
Node current = head;
Node previous = null;
do
{
if (current.Value % 2 == 0)
{
if (current == head)
{
if (head == tail)
{
head = null;
tail = null;
}
else
{
head = head.Next;
tail.Next = head;
current = head;
}
}
else
{
previous.Next = current.Next;
if (current == tail)
{
tail = previous;
}
current = previous.Next;
}
}
else
{
previous = current;
current = current.Next;
}
} while (current != head);
}
public void RemoveDuplicates()
{
if (head == null)
{
return;
}
Node current = head;
do
{
Node runner = current;
while (runner.Next != head)
{
if (runner.Next.Value == current.Value)
{
if (runner.Next == tail)
{
tail = runner;
}
runner.Next = runner.Next.Next;
}
else
{
runner = runner.Next;
}
}
current = current.Next;
} while (current != head);
}
}
// Класс стек
class Stack : MyList
{
private int count = 0;
public bool Push(int element)
{
Add(element);
count++;
return true;
}
public int Pop()
{
if (head == null)
{
throw new InvalidOperationException("Стек пуст.");
}
int topValue = tail.Value;
RemoveItem(topValue);
count--;
return topValue;
}
public int Peek()
{
if (tail == null)
{
throw new InvalidOperationException("Стек пуст.");
}
return tail.Value;
}
public int Count()
{
return count;
}
public void PrintStack()
{
if (head == null)
{
Console.WriteLine("Стек пуст.");
return;
}
Node current = head;
Console.Write("Элементы стека: ");
do
{
Console.Write(current.Value + " ");
current = current.Next;
} while (current != head);
Console.WriteLine();
}
}
// Класс очередь
class Queue : MyList
{
private int count = 0;
public bool Enqueue(int element)
{
Add(element);
count++;
return true;
}
public int Dequeue()
{
if (head == null)
{
throw new InvalidOperationException("Очередь пуста.");
}
int frontValue = head.Value;
RemoveItem(frontValue);
count--;
return frontValue;
}
public int PeekFront()
{
if (head == null)
{
throw new InvalidOperationException("Очередь пуста.");
}
return head.Value;
}
public int Count()
{
return count;
}
public void PrintQueue()
{
if (head == null)
{
Console.WriteLine("Очередь пуста.");
return;
}
Node current = head;
Console.Write("Элементы очереди: ");
do
{
Console.Write(current.Value + " ");
current = current.Next;
} while (current != head);
Console.WriteLine();
}
}
class Program
{
static void Main(string[] args)
{
MyList list = new MyList();
Stack stack = new Stack();
Queue queue = new Queue();
bool keepRunning = true;
while (keepRunning)
{
Console.WriteLine("1. Работа со списком");
Console.WriteLine("2. Работа со стеком");
Console.WriteLine("3. Работа с очередью");
Console.WriteLine("4. Выйти");
string choice = Console.ReadLine();
switch (choice)
{
case "1":
WorkWithList(list);
break;
case "2":
WorkWithStack(stack);
break;
case "3":
WorkWithQueue(queue);
break;
case "4":
keepRunning = false;
break;
default:
Console.WriteLine("Неверный выбор.");
break;
}
}
}
static void WorkWithList(MyList list)
{
bool keepRunning = true;
while (keepRunning)
{
Console.WriteLine("1. Добавить элемент в список");
Console.WriteLine("2. Удалить элемент из списка");
Console.WriteLine("3. Очистить список");
Console.WriteLine("4. Поиск элемента в списке");
Console.WriteLine("5. Удалить четные элементы");
Console.WriteLine("6. Удалить повторяющиеся элементы");
Console.WriteLine("7. Показать список");
Console.WriteLine("8. Вернуться в главное меню");
string choice = Console.ReadLine();
switch (choice)
{
case "1":
Console.Write("Введите элемент: ");
int addValue = int.Parse(Console.ReadLine());
list.Add(addValue);
break;
case "2":
Console.Write("Введите элемент для удаления: ");
int removeValue = int.Parse(Console.ReadLine());
bool removed = list.RemoveItem(removeValue);
Console.WriteLine(removed ? "Элемент удален." : "Элемент не найден.");
break;
case "3":
bool cleared = list.Clear();
Console.WriteLine(cleared ? "Список очищен." : "Список пуст.");
break;
case "4":
Console.Write("Введите элемент для поиска: ");
int searchValue = int.Parse(Console.ReadLine());
bool found = list.Search(searchValue);
Console.WriteLine(found ? "Элемент найден." : "Элемент не найден.");
break;
case "5":
list.RemoveEven();
Console.WriteLine("Четные элементы удалены.");
break;
case "6":
list.RemoveDuplicates();
Console.WriteLine("Повторяющиеся элементы удалены.");
break;
case "7":
list.PrintList();
break;
case "8":
keepRunning = false;
break;
default:
Console.WriteLine("Неверный выбор.");
break;
}
}
}
static void WorkWithStack(Stack stack)
{
bool keepRunning = true;
while (keepRunning)
{
Console.WriteLine("1. Добавить элемент в стек (Push)");
Console.WriteLine("2. Удалить верхний элемент из стека (Pop)");
Console.WriteLine("3. Взять верхний элемент из стека (Peek)");
Console.WriteLine("4. Число элементов в стеке");
Console.WriteLine("5. Показать стек");
Console.WriteLine("6. Вернуться в главное меню");
string choice = Console.ReadLine();
switch (choice)
{
case "1":
Console.Write("Введите элемент: ");
int pushValue = int.Parse(Console.ReadLine());
stack.Push(pushValue);
break;
case "2":
try
{
int popValue = stack.Pop();
Console.WriteLine($"Удален элемент: {popValue}");
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.Message);
}
break;
case "3":
try
{
int peekValue = stack.Peek();
Console.WriteLine($"Верхний элемент: {peekValue}");
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.Message);
}
break;
case "4":
Console.WriteLine($"Число элементов в стеке: {stack.Count()}");
break;
case "5":
stack.PrintStack();
break;
case "6":
keepRunning = false;
break;
default:
Console.WriteLine("Неверный выбор.");
break;
}
}
}
static void WorkWithQueue(Queue queue)
{
bool keepRunning = true;
while (keepRunning)
{
Console.WriteLine("1. Добавить элемент в очередь (Enqueue)");
Console.WriteLine("2. Удалить элемент из очереди (Dequeue)");
Console.WriteLine("3. Взять первый элемент из очереди (Peek)");
Console.WriteLine("4. Число элементов в очереди");
Console.WriteLine("5. Показать очередь");
Console.WriteLine("6. Вернуться в главное меню");
string choice = Console.ReadLine();
switch (choice)
{
case "1":
Console.Write("Введите элемент: ");
int enqueueValue = int.Parse(Console.ReadLine());
queue.Enqueue(enqueueValue);
break;
case "2":
try
{
int dequeueValue = queue.Dequeue();
Console.WriteLine($"Удален элемент: {dequeueValue}");
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.Message);
}
break;
case "3":
try
{
int peekFrontValue = queue.PeekFront();
Console.WriteLine($"Первый элемент: {peekFrontValue}");
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.Message);
}
break;
case "4":
Console.WriteLine($"Число элементов в очереди: {queue.Count()}");
break;
case "5":
queue.PrintQueue();
break;
case "6":
keepRunning = false;
break;
default:
Console.WriteLine("Неверный выбор.");
break;
}
}
}
}
Томск 2024