我有一个简单的堆栈实现。但是我无法意识到程序员如何解决以下问题:无法将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 :(得分: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; }
}