如何将0项目推送到int的堆栈?

时间:2015-09-29 12:12:35

标签: c# algorithm

我有一个简单的堆栈实现。但是我无法意识到程序员如何解决以下问题:无法将0推送到堆栈。怎么做?我的意思是如何跟踪它是0值还是只是堆栈的结尾?或者它在我的实现中不是问题?

public class Stack: IStack
{
    private int[] s;
    private int N = 0;

    public Stack(int N)
    {
        s = new int[N];
    }

    public void push(int x)
    {
        s[N++] = x;

        if (N >= s.Length)
        {
            Array.Resize(ref s, s.Length*2);
        }
    }

    public int pop()
    {
        s[N] = 0;
        return s[--N];
    }
}

3 个答案:

答案 0 :(得分:2)

您已使用N(或更确切地说,N - 1)跟踪堆栈的最后一个元素。您不需要验证元素是否为0,并且您的实现实际上并不区分零和其他数字。

在您提供的实现中,完全可以将0推入堆栈。

顺便说一句,我会重新实现你的pop()方法:

public int? pop()
{
    if (N != 0)
    {
        return s[--N];
    }
    else
    {
        return null;
    }
}

这样,如果堆栈为空,它将返回null

答案 1 :(得分:2)

您应该意识到值S[N], S[N+1], ...的含义并不重要,因为您只为实现使用值S[0..N-1]。您认为部分S[N...]未初始化,添加新元素(即0)会导致S[N]初始化为新值。

答案 2 :(得分:1)

你可以推0没有阻止它。 N等于元素的数量,它还用于跟踪下一个项目的索引以推送N == (index of last element + 1)。我看到的问题是,如果你运行pop()太多次,你将获得IndexOutOfRangeException

您可以像这样添加IsEmpty属性:

public bool IsEmpty
{
    get { return N < 1; }
}