Я пытаюсь написать программу для задания, которое выводит и добавляет первые 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();
}
}
Ваш метод Add суммирует первые два элемента, которые были помещены в стек, вместо двух последних. Это нарочно? В вашем примере, ожидаете ли вы в сумме 9 + 8 или 1 + 0?
Ваше назначение записывать относится к классу Stack? Обратите внимание, что в C#, как и в большинстве других языков, он уже есть. Почему Add действует как очередь? Вы захватываете первые элементы в стеке, а не те, что вверху, всплывающие элементы - это не те, которые вы добавляете.
Кроме того, проблема не в вашем методе Pop, а в методе Display.





В вашем коде есть две ошибки.
Сначала метод 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 реализован правильно, в нем нет необходимости.
@KevinGosse есть ли особый синтаксис для этого
dataStack.top, который кажется недействительным?