Реализация stack в C#

У меня есть задание, нужно реализовать структуру данных, которая будет реализововать операции добавления элементов в стек, удаления из стека и подсчитывать сумму d чисел находящихся на вершине стека. Выводить мне нужно просто элементы, которые были удалены из стека и подсчитанную сумму стека.

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        Stack<int> stack = [];
        List<int> result = [];

        for (int i = 0; i < n; i++)
        {
            string input = Console.ReadLine();

            if (!string.IsNullOrEmpty(input))
            {
                string command = input[0].ToString();
                string valueStr = input.Length > 1 ? input.Substring(1) : "";

                switch (command)
                {
                    case "+":
                        stack.Push(int.Parse(valueStr));
                        break;

                    case "-":
                        if (stack.Count > 0)
                            result.Add(stack.Pop());
                        else
                            result.Add(0);
                        break;

                    case "?":
                        int sum = 0;

                        if (string.IsNullOrEmpty(valueStr))
                        {
                            foreach (var value in stack)
                            {
                                sum += value;
                            }
                        }
                        else
                        {
                            int k = int.Parse(valueStr);
                            int count = 0;

                            foreach (var value in stack)
                            {
                                if (count >= k) break;
                                sum += value;
                                count++;
                            }
                        }

                        result.Add(sum);
                        break;
                }
            }
        }

        foreach (var item in result)
        {
            Console.WriteLine(item);
        }
    }
}

Изначально я реализовал собственный стек с методами Push, Pop и тд. Затем использовал уже встроенный стек.

Вопрос у меня таков: что может быть не так с данной реализацией? Какие ошибки она может принести?


Ответы (1 шт):

Автор решения: Aziz Umarov

Вам нужно реализовать структуру данных, которая работает как стек, но с дополнительной операцией для подсчета суммы заданного количества элементов на его вершине. Можно воспользоваться готовым стеком а можно создать класс CustomStack, который поддерживает операции добавления (Push), удаления (Pop), и подсчёта суммы d элементов на вершине стека (SumTop).

using System;
using System.Collections.Generic;

public class CustomStack
{
    private Stack<int> stack = new Stack<int>();

    // Метод для добавления элемента в стек
    public void Push(int value)
    {
        stack.Push(value);
        Console.WriteLine($"Элемент {value} добавлен в стек.");
    }

    // Метод для удаления элемента из стека
    public int Pop()
    {
        if (stack.Count == 0)
        {
            Console.WriteLine("Стек пуст.");
            return -1; // Например, возвращаем -1, если стек пуст
        }

        int removedElement = stack.Pop();
        Console.WriteLine($"Элемент {removedElement} удален из стека.");
        return removedElement;
    }

    // Метод для подсчета суммы d элементов на вершине стека
    public int SumTop(int d)
    {
        if (d > stack.Count)
        {
            Console.WriteLine("В стеке недостаточно элементов для подсчета суммы.");
            return 0;
        }

        int sum = 0;
        int count = 0;
        
        foreach (var item in stack)
        {
            sum += item;
            count++;
            if (count == d) break;
        }

        Console.WriteLine($"Сумма {d} верхних элементов стека: {sum}");
        return sum;
    }
}

class Program
{
    static void Main()
    {
        CustomStack customStack = new CustomStack();
        
        customStack.Push(10);
        customStack.Push(20);
        customStack.Push(30);
        
        customStack.SumTop(2); // Суммируем два верхних элемента стека

        customStack.Pop();
        customStack.SumTop(2); // Суммируем два верхних элемента стека после удаления
    }
}
→ Ссылка