Как использовать метод Stack's Pop в другом методе

Я пытаюсь написать программу для задания, которое выводит и добавляет первые 2 элемента в стек. В программе есть метод Pop, но я хотел бы знать, как вызвать этот метод внутри метода Add. Предполагается, что этот Add выталкивает два верхних элемента в стек, получает их сумму и помещает эту сумму в стек. В моем коде ниже я дважды вызываю метод Pop внутри метода Add, но когда я показываю стек, в стеке все еще сохраняются все исходные значения. Есть ли что-то еще / еще мне нужно пойти, чтобы заставить метод Pop работать?

class StackEmptyException : ApplicationException
{
    public StackEmptyException(String message) : base(message)
    {
    }
}

class MathStack
{
    private int[] dataStack;
    private int size;        
    private int top = -1;

    public bool IsEmpty()
    {
        return top == -1;
    }
    public bool IsFull()
    {
        return top == size - 1;
    }
    public void Push(int i)
    {
        dataStack[++top] = i;
    }
    public int Pop()
    {
        if (IsEmpty())
            throw new StackEmptyException
                       ("Stack empty -- cannot pop");
        else
            return dataStack[top--];
    }
    public int Top()
    {
        if (IsEmpty())
            throw new StackEmptyException
                        ("Stack empty -- top undefined");
        else
            return dataStack[top];
    }

    public MathStack()
    {
        dataStack = new int[10];
    }

    public MathStack(int s)
    {
        size = 10;
        dataStack = new int[size];
    }

    public void LoadStack(int v)
    {
        dataStack[++top] = v;
    }

    public void Display()
    {
        int[] display = new int[dataStack.Length];
        for (int i = 0; i < dataStack.Length; i++)
        {
            display[i] = dataStack[i];
            Console.WriteLine("{0}", display[i]);
        }
    }

    public void Add()
    {
        int add1 = dataStack[0];
        int add2 = dataStack[1];
        Pop();
        Pop();
        int sum = add1 + add2;
        Console.WriteLine("Sum: {0}", sum);
    }
}

class Program
{
    static void Main(string[] args)
    {
        MathStack stack1 = new MathStack();
        stack1.Push(9);
        stack1.Push(8);
        stack1.Push(7);
        stack1.Push(6);
        stack1.Push(5);
        stack1.Push(4);
        stack1.Push(3);
        stack1.Push(2);
        stack1.Push(1);
        stack1.Push(0);

        stack1.Display();
        stack1.Add();
        stack1.Display();

        Console.ReadLine();
    }
}

@KevinGosse есть ли особый синтаксис для этого dataStack.top, который кажется недействительным?

ZL4892 11.11.2018 19:55

Ваш метод Add суммирует первые два элемента, которые были помещены в стек, вместо двух последних. Это нарочно? В вашем примере, ожидаете ли вы в сумме 9 + 8 или 1 + 0?

Kevin Gosse 11.11.2018 19:55

Ваше назначение записывать относится к классу Stack? Обратите внимание, что в C#, как и в большинстве других языков, он уже есть. Почему Add действует как очередь? Вы захватываете первые элементы в стеке, а не те, что вверху, всплывающие элементы - это не те, которые вы добавляете.

Clockwork-Muse 11.11.2018 19:58

Кроме того, проблема не в вашем методе Pop, а в методе Display.

Clockwork-Muse 11.11.2018 20:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
185
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем коде есть две ошибки.

Сначала метод Display отображает весь массив. За исключением того, что, поскольку вы физически не удаляете элементы из массива, вам нужно остановиться на индексе top:

public void Display()
{
    if (IsEmpty())
    {
        Console.WriteLine("Empty");
        return;
    }

    for (int i = 0; i <= top; i++)
    {
        Console.WriteLine(dataStack[i]);
    }
}

Вторая проблема - ваш Add. Насколько я понимаю, вы хотите вытащить последние два элемента, просуммировать их и выдать результат. В вашей реализации вы фактически суммируете первые два элемента (а не последние два). Лучшая версия была бы:

public void Add()
{
    int add1 = Pop();
    int add2 = Pop();
    int sum = add1 + add2;
    Console.WriteLine("Sum: {0}", sum);
    Push(sum);
}

Обратите внимание, что у меня нет прямого доступа к dataStack. Если ваш API реализован правильно, в нем нет необходимости.

Другие вопросы по теме