【问题标题】:How to use a Stack's Pop method in another method如何在另一个方法中使用 Stack 的 Pop 方法
【发布时间】:2019-04-14 13:42:53
【问题描述】:

我正在尝试编写一个程序,用于弹出并添加堆栈中的前 2 个项目。该程序有一个Pop 方法,但我想知道如何在Add 方法中调用该方法。这个Add 应该弹出堆栈中的顶部两个项目,获取它们的总和,然后将该总和推送到堆栈中。在下面的代码中,我在Add 方法内调用了两次Pop 方法,但是当我显示堆栈时,堆栈仍然具有所有原始值。我还需要做些什么才能让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 似乎无效的特定语法?
  • 您的Add 方法将推入堆栈的前两项相加,而不是最后两项。这是故意的吗?在您的示例中,您希望求和 9+8 还是 1+0?
  • 你的任务是write Stack 类吗?请注意,与大多数其他语言一样,C# 已经有了一个。为什么Add 表现得像一个队列?您正在抓取堆栈中的第一个元素,而不是顶部的元素,弹出的元素不是您要添加的元素。
  • 另外,您的Pop 方法不是问题,是Display 方法。

标签: c# methods data-structures stack


【解决方案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 已正确实现,则不需要它。

【讨论】:

    猜你喜欢
    • 2018-09-01
    • 2012-09-30
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    相关资源
    最近更新 更多