C#如何在另一种方法中使用堆栈的Pop方法

时间:2018-11-11 18:41:48

标签: c# methods data-structures stack 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();
    }
}

1 个答案:

答案 0 :(得分: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正确实现,则不需要它。