通用堆栈(破解编码面试)

Generic Stack (Cracking the coding interview)

我在 "Cracking the coding" 面试中理解 Stack class 的实现有一些问题(对于那些有这本书的人来说,它是第 3 章的第一页 "Stack and Queues")。

代码如下所示:

public class MyStack<T>{
  private static class StackNode<T>{
    private T data;
    private StackNode<T> next;
    public StackNode(T data){
      thid.data = data;
    }
  }
  private StackNode<T> top;
// and so on
}

问题是我真的不明白为什么我要为MyStackStacknode使用泛型T。堆栈是 "queue" 个节点,由值组成。 当我自己第一次尝试这样做时,我做了一些看起来更像的事情:

class Stack{
  private static class Node{
    private Object data;
    private Node next;

    public Node(Object data){
      this.data = data;
    }
  }
  private Node top;

  public Stack(){
    top = null;
  }
  public Stack(Node top){
    this.top = top;
    top.next = null;
  }
//and so on
}

对我来说,MyStack<T> 意味着我正在创建一个由另一个对象 T 组成的对象 MyStack,这没有任何意义。如果栈是由节点组成的,那么我的类型T应该是类型StackNode(???)。但是,当我定义 Stacknode<T> 时,它就像在说 Stacknode<Stacknode>。我想我对泛型类型很困惑,但关键是我不明白为什么像我在代码中那样做是不够的:无论它是什么类型的堆栈,它都是由节点组成的,然后当然可以有一个通用数据,所以我只是说我的节点的数据是Object类型的,有人能解释一下主要区别吗,或者至少为什么在"Cracking the coding interview"中是这样的?有什么好处?我理解错了什么? 提前致谢!!

这里<T>的作用是为栈中存储的元素指定一个类型。这里T是一种模板,在声明时可以替换为任何类型。

例如,如果你想创建一个字符串栈,你可以声明为

Stack<String> myStack;

这将确保内部 class Node 也将使用 String 作为 data 的数据类型。您只需在堆栈声明期间指定类型,就可以了。这样,当您需要一堆 Integer 时,您就不必再次编写 Stack class。