Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практики / ПР4 / СД_П4.odt
Скачиваний:
0
Добавлен:
27.06.2025
Размер:
175.98 Кб
Скачать

Министерство науки и высшего образования Российской Федерации

Федеральное государственное бюджетное образовательное учреждение высшего образования

ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)

Кафедра безопасности информационных систем (БИС)

СТЕКИ И ОЧЕРЕДИ

Отчет по практической работе №4

по дисциплине «Структуры данных»

Студент гр. 733-1

_______ Сметанников Д.Е

_______

Принял:

преподаватель КИБЭВС

_______ Д.Р. Уразаев

_______

Задание

Реализовать на базе классов из практики 3 работу с очередью и со стеком.

Продемонстрировать типовые функции работы со стеком: - 

  1. удалить из стека - возвращать  удаляемый  элемент возвращается по результату  работы  метода, 

  2. добавить в стек,

  3.  число элементов стека,

  4.  взять верхний элемент стека без удаления.

Очередь: 

  1. число элементов в очереди, 

  2. удалить из очереди 

  3. добавить в очередь. 

  4. получить первый элемент из очереди без удаления из нее.

Содержание

Задание 2

1 Введение 4

2 Ход работы 5

Заключение 9

Приложение А 10

  1. Введение

Целью данной работы является реализация классов для работы со стеком и очередью на основе ранее изученных концепций.

  1. Ход работы

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

Соседние файлы в папке ПР4