C # как использовать метод Pop в стеке в другом методе - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь написать программу для задания, которое выскакивает и добавляет первые 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();
    }
}

1 Ответ

0 голосов
/ 11 ноября 2018

В вашем коде две вещи неправильные.

Во-первых, метод 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 правильно реализован, он не нужен.

...