如何将0项压入int的堆栈

本文关键字:int 堆栈 0项 | 更新日期: 2023-09-27 18:14:57

我有一个简单的堆栈实现。但是我不知道程序员是如何解决以下问题的:不可能把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];
    }
}

如何将0项压入int的堆栈

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

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

顺便说一下,我会像这样重新实现你的pop()方法:
public int? pop()
{
    if (N != 0)
    {
        return s[--N];
    }
    else
    {
        return null;
    }
}

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

您应该意识到S[N], S[N+1], ...的值是什么并不重要,因为您只使用S[0..N-1]的值来实现。您将部分S[N...]视为未初始化的,并且添加一个新元素,甚至是0,都会导致S[N]被初始化为新值。

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

你可以这样添加IsEmpty属性:

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