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

时间:2018-06-29 20:31:47

标签: java class stack generic-programming

在“破解编码”采访中,我在理解Stack类的实现时遇到了一些问题(对于那些拥有本书的人来说,这是第3章“堆栈和队列”的第一页)。

代码如下:

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
}

问题是我真的不明白为什么我应该对T使用通用类型MyStack,而对Stacknode使用通用类型。堆栈是节点的“队列”,由值组成。 当我第一次尝试自己做到这一点时,我做了一些更像是的事情:

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>意味着我正在创建由另一个对象MyStack组成的对象T,这没有任何意义。如果堆栈由节点组成,则我的类型T应该是类型StackNode(???)。但是,当我定义Stacknode<T>时,就像是说Stacknode<Stacknode>。我认为我对泛型类型非常困惑,但要点是我不明白为什么这样做不像我在代码中所做的那样足够:无论哪种堆栈,它都是由节点组成的,然后当然可以拥有通用数据,所以我刚刚说过我的Node的数据类型为Object,有人可以解释主要区别吗,或者至少为什么在“破解编码面试”中这样做?有什么优势?我理解错了什么? 预先谢谢你!

1 个答案:

答案 0 :(得分:0)

这里 $matches = preg_split('/\s*(\d*)/', $lines[$i]); 的目的是为要存储在堆栈中的元素指定一种类型。 <T>是一种模板,可以在声明时替换为任何类型。

例如,如果您希望创建一堆字符串,则可以将其声明为

T

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