Загрузка данных
Практическая работа: Коллекции в C#
Объяснение коллекций
Hashtable
Хэш-таблица хранит пары "ключ-значение". Ключи должны быть уникальными, а значения могут повторяться. Использует хэш-код ключа для быстрого доступа к данным.
Stack (Стек)
Работает по принципу LIFO (Last In, First Out) - последний пришёл, первый ушёл. Как стопка тарелок.
Queue (Очередь)
Работает по принципу FIFO (First In, First Out) - первый пришёл, первый ушёл. Как очередь в магазине.
---
Решения задач
Hashtable
```csharp
using System;
using System.Collections;
class HashtableTasks
{
static void Main()
{
// Задача 1: Создание и вывод Hashtable
Console.WriteLine("=== Задача 1 ===");
Hashtable phoneBook = new Hashtable();
phoneBook.Add("Анна", "123-456");
phoneBook.Add("Борис", "789-012");
phoneBook.Add("Вика", "345-678");
foreach (DictionaryEntry entry in phoneBook)
{
Console.WriteLine($"Ключ: {entry.Key}, Значение: {entry.Value}");
}
// Задача 2: Поиск значения по ключу
Console.WriteLine("\n=== Задача 2 ===");
string searchKey = "Борис";
if (phoneBook.ContainsKey(searchKey))
{
Console.WriteLine($"Значение для ключа '{searchKey}': {phoneBook[searchKey]}");
}
else
{
Console.WriteLine($"Ключ '{searchKey}' не найден");
}
// Задача 3: Удаление элемента
Console.WriteLine("\n=== Задача 3 ===");
phoneBook.Remove("Анна");
Console.WriteLine("После удаления 'Анна':");
foreach (DictionaryEntry entry in phoneBook)
{
Console.WriteLine($"{entry.Key}: {entry.Value}");
}
// Задача 4: Подсчет элементов
Console.WriteLine("\n=== Задача 4 ===");
Console.WriteLine($"Количество элементов: {phoneBook.Count}");
// Задача 5: Объединение двух Hashtable
Console.WriteLine("\n=== Задача 5 ===");
Hashtable anotherBook = new Hashtable();
anotherBook.Add("Глеб", "901-234");
anotherBook.Add("Дина", "567-890");
Hashtable mergedBook = new Hashtable();
foreach (DictionaryEntry entry in phoneBook)
mergedBook.Add(entry.Key, entry.Value);
foreach (DictionaryEntry entry in anotherBook)
mergedBook.Add(entry.Key, entry.Value);
Console.WriteLine("Объединенная таблица:");
foreach (DictionaryEntry entry in mergedBook)
Console.WriteLine($"{entry.Key}: {entry.Value}");
// Задача 6: Получение всех ключей и значений
Console.WriteLine("\n=== Задача 6 ===");
Console.WriteLine("Все ключи:");
foreach (object key in mergedBook.Keys)
Console.Write($"{key} ");
Console.WriteLine("\nВсе значения:");
foreach (object value in mergedBook.Values)
Console.Write($"{value} ");
Console.WriteLine();
// Задача 7: Изменение значения по ключу
Console.WriteLine("\n=== Задача 7 ===");
mergedBook["Борис"] = "999-999";
Console.WriteLine("После изменения значения для 'Борис':");
foreach (DictionaryEntry entry in mergedBook)
Console.WriteLine($"{entry.Key}: {entry.Value}");
}
}
```
Stack
```csharp
using System;
using System.Collections;
class StackTasks
{
static void Main()
{
// Задача 1: Создание и добавление элементов
Console.WriteLine("=== Задача 1 ===");
Stack stack = new Stack();
stack.Push("Первый");
stack.Push("Второй");
stack.Push("Третий");
foreach (object item in stack)
Console.WriteLine(item);
// Задача 2: Извлечение элемента
Console.WriteLine("\n=== Задача 2 ===");
object popped = stack.Pop();
Console.WriteLine($"Извлечен: {popped}");
// Задача 3: Получение верхнего элемента без извлечения
Console.WriteLine("\n=== Задача 3 ===");
object top = stack.Peek();
Console.WriteLine($"Верхний элемент: {top}");
// Задача 4: Проверка, пуст ли стек
Console.WriteLine("\n=== Задача 4 ===");
Console.WriteLine(stack.Count == 0 ? "Стек пуст" : $"В стеке {stack.Count} элементов");
// Задача 5: Переворот строки
Console.WriteLine("\n=== Задача 5 ===");
string original = "Hello World!";
Console.WriteLine($"Исходная: {original}");
Console.WriteLine($"Перевернутая: {ReverseString(original)}");
// Задача 6: Подсчет скобок
Console.WriteLine("\n=== Задача 6 ===");
string test1 = "((a+b)*(c-d))";
string test2 = "((a+b)*(c-d)";
Console.WriteLine($"'{test1}': {(CheckBrackets(test1) ? "Правильно" : "Неправильно")}");
Console.WriteLine($"'{test2}': {(CheckBrackets(test2) ? "Правильно" : "Неправильно")}");
// Задача 7: Удаление до определенного значения
Console.WriteLine("\n=== Задача 7 ===");
Stack numbers = new Stack();
numbers.Push(10); numbers.Push(20); numbers.Push(30);
numbers.Push(40); numbers.Push(50);
RemoveUntilValue(numbers, 30);
Console.WriteLine("После удаления до 30:");
foreach (object item in numbers)
Console.WriteLine(item);
}
static string ReverseString(string input)
{
Stack stack = new Stack();
foreach (char c in input)
stack.Push(c);
char[] reversed = new char[input.Length];
for (int i = 0; i < input.Length; i++)
reversed[i] = (char)stack.Pop();
return new string(reversed);
}
static bool CheckBrackets(string input)
{
Stack stack = new Stack();
foreach (char c in input)
{
if (c == '(')
stack.Push(c);
else if (c == ')')
{
if (stack.Count == 0) return false;
stack.Pop();
}
}
return stack.Count == 0;
}
static void RemoveUntilValue(Stack stack, object value)
{
while (stack.Count > 0 && !stack.Peek().Equals(value))
stack.Pop();
}
}
```
Queue
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
class QueueTasks
{
static void Main()
{
// Задача 1: Создание и добавление элементов
Console.WriteLine("=== Задача 1 ===");
Queue<string> queue = new Queue<string>();
queue.Enqueue("Элемент 1");
queue.Enqueue("Элемент 2");
queue.Enqueue("Элемент 3");
foreach (string item in queue)
Console.WriteLine(item);
// Задача 2: Извлечение элемента
Console.WriteLine("\n=== Задача 2 ===");
string dequeued = queue.Dequeue();
Console.WriteLine($"Извлечен: {dequeued}");
// Задача 3: Получение первого элемента без извлечения
Console.WriteLine("\n=== Задача 3 ===");
string first = queue.Peek();
Console.WriteLine($"Первый элемент: {first}");
// Задача 4: Проверка, пуста ли очередь
Console.WriteLine("\n=== Задача 4 ===");
Console.WriteLine(queue.Count == 0 ? "Очередь пуста" : $"В очереди {queue.Count} элементов");
// Задача 5: Симуляция обслуживания клиентов
Console.WriteLine("\n=== Задача 5 ===");
SimulateCustomerService();
// Задача 6: Обратная очередь
Console.WriteLine("\n=== Задача 6 ===");
Queue<string> originalQueue = new Queue<string>();
originalQueue.Enqueue("A"); originalQueue.Enqueue("B");
originalQueue.Enqueue("C"); originalQueue.Enqueue("D");
Console.WriteLine("Исходная очередь: " + string.Join(", ", originalQueue));
Queue<string> reversed = ReverseQueue(originalQueue);
Console.WriteLine("Перевернутая очередь: " + string.Join(", ", reversed));
}
static void SimulateCustomerService()
{
Queue<string> customerQueue = new Queue<string>();
customerQueue.Enqueue("Клиент 1");
customerQueue.Enqueue("Клиент 2");
customerQueue.Enqueue("Клиент 3");
customerQueue.Enqueue("Клиент 4");
int number = 1;
while (customerQueue.Count > 0)
{
string customer = customerQueue.Dequeue();
Console.WriteLine($"Обслуживается {customer}");
Console.WriteLine($"Осталось в очереди: {customerQueue.Count} клиентов\n");
}
Console.WriteLine("Все клиенты обслужены!");
}
static Queue<T> ReverseQueue<T>(Queue<T> queue)
{
Stack<T> stack = new Stack<T>();
while (queue.Count > 0)
stack.Push(queue.Dequeue());
Queue<T> reversed = new Queue<T>();
while (stack.Count > 0)
reversed.Enqueue(stack.Pop());
return reversed;
}
}
```
Краткие пояснения
Hashtable
· Add() - добавляет пару ключ-значение
· ContainsKey() - проверяет наличие ключа
· Remove() - удаляет элемент по ключу
· Count - количество элементов
· Keys/Values - коллекции ключей/значений
Stack
· Push() - добавляет элемент наверх
· Pop() - извлекает и удаляет верхний элемент
· Peek() - показывает верхний элемент без удаления
· Count - количество элементов
Queue
· Enqueue() - добавляет элемент в конец очереди
· Dequeue() - извлекает и удаляет первый элемент
· Peek() - показывает первый элемент без удаления
· Count - количество элементов