Министерство науки и высшего образования Российской Федерации
Федеральное государственное автономное образовательное учреждение
высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ
УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)
СТЕКИ И ОЧЕРЕДЬ
Отчёт по практической работе №4
по дисциплине «Структуры данных»
Студент гр. 714-1
_______ И.С. Максимов
__.__.2025
Доцент кафедры КИБЭВС
_______ Е.Е. Лунёва
__.__.2025
Томск 2025
Оглавление
Введение 3
Заключение 6
МОГУТ БЫТЬ ПРОБЛЕМЫ С СОДЕРЖАНИЕМ В PDF
Введение
Реализовать на базе классов из предыдущего задания работы с очередью и стеком.
Требуется продемонстрировать типовые функции работы со стеком:
Удаление из стека,
Добавление в стек,
Изменение числа элементов стека,
Взятие верхнего элемента стека без удаления.
Для очереди требуется реализовать:
Изменение числа элементов в очереди,
Удаление из очереди,
Добавление в очередь.
Ход работы
В ходе работы были созданы классы Stack и Queue. Для каждого из них были созданы методы в соответствие с заданием. Методы представлены в таблице 1.1.
Таблица 1.1 – Описание классов стека и очереди
Классы |
|
Stack |
Queue |
Методы классов и их описание |
|
Метод Push() — добавляет новый элемент в стек. |
Метод Enqueue() — добавляет элемент в конец очереди. |
Метод Pop() — удаляет верхний элемент из стека и возвращает его значение. |
Метод Dequeue() — удаляет элемент из начала очереди. |
Метод Peek() — возвращает значение верхнего элемента стека без удаления. |
Метод Peek() — возвращает значение верхнего элемента стека без удаления. |
Метод Count() – считает количество элементов. |
Метод Count() – считает количество элементов. |
Пример работы программы приведён на рисунках 1.1, 1.2, 1.3.
Рисунок 1.1 – Выбор структуры для работы
Рисунок 1.2 – Выбор действия для работы со структурой и его выполнение
Рисунок 1.3 – Значение добавлено в стек
Заключение
В процессе выполнения практической работы были освоены навыки работы со стеком и очередью, посредством реализации с ними типовых функций.
Приложение а
Листинг кода: using System;
class Node
{
public int Data;
public Node Next;
public Node(int data)
{
Data = data;
Next = null;
}
}
class Stack
{
private Node top;
public Stack()
{
top = null;
}
public void Push(int data)
{
Node newNode = new Node(data);
newNode.Next = top;
top = newNode;
}
public int? Pop()
{
if (top == null)
return null;
int value = top.Data;
top = top.Next;
return value;
}
public int? Peek()
{
if (top == null)
return null;
return top.Data;
}
public int Count()
{
int count = 0;
Node current = top;
while (current != null)
{
count++;
current = current.Next;
}
return count;
}
public override string ToString()
{
if (top == null)
return "(empty)";
Node current = top;
string result = "";
while (current != null)
{
result += current.Data + " -> ";
current = current.Next;
}
return result + "null";
}
}
class Queue
{
private Node head;
private Node tail;
public Queue()
{
head = null;
tail = null;
}
public void Enqueue(int data)
{
Node newNode = new Node(data);
if (tail == null)
{
head = tail = newNode;
}
else
{
tail.Next = newNode;
tail = newNode;
}
}
public int? Dequeue()
{
if (head == null)
return null;
int value = head.Data;
head = head.Next;
if (head == null)
tail = null;
return value;
}
public int? Peek()
{
if (head == null)
return null;
return head.Data;
}
public int Count()
{
int count = 0;
Node current = head;
while (current != null)
{
count++;
current = current.Next;
}
return count;
}
public override string ToString()
{
if (head == null)
return "(empty)";
Node current = head;
string result = "";
while (current != null)
{
result += current.Data + " -> ";
current = current.Next;
}
return result + "null";
}
}
class Program
{
static void Main()
{
Stack stack = new Stack();
Queue queue = new Queue();
while (true)
{
Console.WriteLine("Выберите структуру:\n");
Console.WriteLine("1. Стек");
Console.WriteLine("2. Очередь");
Console.WriteLine("0. Выход");
Console.Write("Ваш выбор: ");
string structureInput = Console.ReadLine();
if (!int.TryParse(structureInput, out int structureChoice))
{
Console.WriteLine("Ошибка ввода. Введите число.");
continue;
}
if (structureChoice == 0)
{
Console.WriteLine("Выход из программы.");
break;
}
switch (structureChoice)
{
case 1:
StackMenu(stack);
break;
case 2:
QueueMenu(queue);
break;
default:
Console.WriteLine("Некорректный выбор структуры.");
break;
}
}
}
static void StackMenu(Stack stack)
{
Console.WriteLine("Выберите действие:");
while (true)
{
Console.WriteLine("\nМеню стека:");
Console.WriteLine("1. Добавить в стек");
Console.WriteLine("2. Удалить из стека");
Console.WriteLine("3. Взять верхний элемент");
Console.WriteLine("4. Количество элементов");
Console.WriteLine("5. Показать стек");
Console.WriteLine("0. Возврат в главное меню");
Console.Write("Ваш выбор: ");
string input = Console.ReadLine();
if (!int.TryParse(input, out int choice))
{
Console.WriteLine("Ошибка ввода. Введите число.");
continue;
}
if (choice == 0)
break;
switch (choice)
{
case 1:
Console.Write("Введите элемент для добавления: ");
if (int.TryParse(Console.ReadLine(), out int pushElem))
{
stack.Push(pushElem);
Console.WriteLine("Элемент добавлен в стек.");
}
else
{
Console.WriteLine("Ошибка ввода элемента.");
}
break;
case 2:
int? popped = stack.Pop();
if (popped.HasValue)
Console.WriteLine($"Удалён элемент: {popped.Value}");
else
Console.WriteLine("Стек пуст.");
break;
case 3:
int? peeked = stack.Peek();
if (peeked.HasValue)
Console.WriteLine($"Верхний элемент: {peeked.Value}");
else
Console.WriteLine("Стек пуст.");
break;
case 4:
Console.WriteLine($"Количество элементов в стеке: {stack.Count()}");
break;
case 5:
Console.WriteLine("Текущий стек:");
Console.WriteLine(stack.ToString());
break;
default:
Console.WriteLine("Недопустимый выбор.");
break;
}
}
}
static void QueueMenu(Queue queue)
{
Console.WriteLine("Выберите действие:");
while (true)
{
Console.WriteLine("\nМеню очереди:");
Console.WriteLine("1. Добавить в очередь");
Console.WriteLine("2. Удалить из очереди");
Console.WriteLine("3. Взять первый элемент очереди");
Console.WriteLine("4. Количество элементов в очереди");
Console.WriteLine("5. Показать очередь");
Console.WriteLine("0. Возврат в главное меню");
Console.Write("Ваш выбор: ");
string input = Console.ReadLine();
if (!int.TryParse(input, out int choice))
{
Console.WriteLine("Ошибка ввода. Введите число.");
continue;
}
if (choice == 0)
break;
switch (choice)
{
case 1:
Console.Write("Введите элемент для добавления: ");
if (int.TryParse(Console.ReadLine(), out int enqueuedElem))
{
queue.Enqueue(enqueuedElem);
Console.WriteLine("Элемент добавлен в очередь.");
}
else
{
Console.WriteLine("Ошибка ввода элемента.");
}
break;
case 2:
int? dequeued = queue.Dequeue();
if (dequeued.HasValue)
Console.WriteLine($"Удалён элемент: {dequeued.Value}");
else
Console.WriteLine("Очередь пуста.");
break;
case 3:
int? peeked = queue.Peek();
if (peeked.HasValue)
Console.WriteLine($"Первый элемент очереди: {peeked.Value}");
else
Console.WriteLine("Очередь пуста.");
break;
case 4:
Console.WriteLine($"Количество элементов в очереди: {queue.Count()}");
break;
case 5:
Console.WriteLine("Текущая очередь:");
Console.WriteLine(queue.ToString());
break;
default:
Console.WriteLine("Недопустимый выбор.");
break;
}
}
}
}
