面试题答案
一键面试public class Stack<T> where T : class
{
private T[] elements;
private int top;
public Stack(int capacity = 10)
{
elements = new T[capacity];
top = -1;
}
public void Push(T item)
{
if (top == elements.Length - 1)
{
Array.Resize(ref elements, elements.Length * 2);
}
elements[++top] = item;
}
public T Pop()
{
if (top == -1)
{
throw new InvalidOperationException("Stack is empty");
}
return elements[top--];
}
public T Peek()
{
if (top == -1)
{
throw new InvalidOperationException("Stack is empty");
}
return elements[top];
}
}
解释约束原因:
将泛型类型 T
约束为 class
确保只有引用类型可以使用该栈。这是因为在很多场景下,值类型和引用类型在内存管理、传递方式等方面有较大区别。例如,引用类型在传递时是传递引用,而值类型是传递副本。对于栈这种数据结构,如果不加以约束,值类型入栈和出栈时可能会涉及不必要的内存复制操作,影响性能。而且在某些复杂的应用场景中,可能需要对栈中的元素进行多态操作,引用类型可以更方便地实现多态,而值类型则较难做到。此外,约束为引用类型还可以避免一些值类型可能带来的装箱拆箱操作,提高程序运行效率。