Загрузка данных


Практическая работа: Коллекции в 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 - количество элементов