【问题标题】:How to implement my generic LinkedList in my Stack/Queue class in Java如何在 Java 的 Stack/Queue 类中实现我的通用 LinkedList
【发布时间】:2015-06-16 20:09:06
【问题描述】:

我有这个项目,我必须在堆栈和队列类中实现我的 LinkedList 数据结构。包括我的 LinkedList 在内的所有类都是泛型类型<E>。问题是我收到了一堆溢出和空指针异常错误。这是我的后勤:

我的 Stack 和 Queue 类应该实现我之前编写的 LinkedList 类,它可以完美运行(我对其进行了彻底的测试)。我的 LinkedList 同时实现了 LinkedListImplementation,它只包含我应该使用的方法的“蓝图”。另外,我想说所有这些文件-> LinkedListImplementation.java、LinkedList.java 和 Stack.java 都在一个名为package1 的包内。

这里是方法(没有代码,因为我 110% 确定它运行完美):

//LinkedListImplementation.java:
package package1;
import java.util.Iterator;
public class LinkedListImplementation<E> extends Iterable<E>{
    //...
    //All the methods to be used go here. See the methods in LinkedList.java
}//End LinkedListImplementation Implementation Class




//LinkedList.java:
package package1;
import java.util.Iterator;
import java.lang.Comparable;
import java.util.NoSuchElementException;

public class LinkedList<E> implements LinkedListImplementation<E>{
    int size;
    Node<E> head, tail;

    public LinkedList(){
        head = null;
        tail = null;
    }

    class Node<E>{
        E data;
        Node<E> next;

        //Default Node constructor
        Node(E obj){
            this.data = obj;
            next = null;
        }
    }
    //Logic for all the LinkedList methods below.

    //This method contains its code, as an example...
    public void addLast(E obj){
        Node<E> newNode = new Node<E>(obj);
        if( isEmpty() ){
            head = newNode;
            tail = newNode;
            size++;
        }else{
            tail.next = newNode;
            tail = newNode;
            size++;
        }
    }

    public void addFirst(E obj){
        ...
    }

    public void insert(E obj, int location){
        ...
    }

    //... Other methods, such as removeFirst(), removeLast(), remove(int location)
    //... size(), get(int location), contains(E obj), locate(int location)
    //... clear(), isEmpty().
}//End LinkedList Class

如您所见,我本可以在 java 中使用 LinkedList 类,但我不能使用 java.util 中构造并具有默认行为的任何库,即 LinkedList、Stack 和 Queue。我应该自己编写逻辑和实现来模拟他们的行为。

现在,我想实现一个由节点组成的堆栈,实现我的 LinkedList。这是我的尝试:

//Stack.java:
package package1;
import java.util.Iterator;
public class Stack<E> extends LinkedList<E> implements Iterable<E>{
    LinkedList<E> list;

    Stack(){
        list = new LinkedList<E>();
        testStack();
    }

    //START declaration of Stack methods
    public void push(E obj){ list.addFirst(); }

    public E pop(){ return list.removeFirst() }

    public int size(){ return list.size(); }

    public boolean isEmpty(){ return list.isEmpty(); }

    public E peek(){ return list.get(size()); }

    public boolean contains(E obj){ return list.contains(obj); }

    public void makeEmpty(){ list.clear(); }

    public Iterator<E> iterator(){ return list.iterator(); } 
    //END declaration of Stack methods

    //My tests to see if the Stack works
    public void testStack{

        Stack<Integer> testStack = new Stack<Integer>();
        //Test push method
        for(int i = 1; i < 100; i++){
            stack.push(new Integer(i));
        }
    }//End testStack

    public static void main(String [] args) {
        try {
            new Stack();
        } catch(Exception e) {
            System.out.println("ERROR: " + e);
            e.printStackTrace();
        }
    }//End Main method

}//End Stack Class

这是我的代码。我什至没有尝试使用 Queue 类,因为一旦我启动并运行了 Stack 一,实现 Queue 一将非常容易。

每当我运行我的代码时,我都会收到以下错误:

Exception in thread "main" java.lang.StackOverflowError
    at data_structures.LinearList.<init>(LinkedList.java:24)
    at data_structures.Stack.<init>(Stack.java:9)
    at data_structures.Stack.testStack(Stack.java:25)
    at data_structures.Stack.<init>(Stack.java:11)
    at data_structures.Stack.testStack(Stack.java:25)
    at data_structures.Stack.<init>(Stack.java:11)
    at data_structures.Stack.testStack(Stack.java:25)
    ...//A lot more of the same line 11 and 25 errors...

我认为错误的发生是因为 testStack 方法中的 for 循环以及我的代码中存在的某种类实例化错误。第一个错误(第 24 行)涉及 LinkedList 类构造函数。第二个错误(第 9 行)指的是 Stack 类构造函数。第三个错误(第 25 行)指的是 runTests() 方法内部的堆栈实例化,即以下行:Stack&lt;Integer&gt; testStack = new Stack&lt;Integer&gt;();。第四个错误(第 11 行)指的是 Stack() 类默认构造函数中的 testStack 调用。

有人可以帮助我找到实现目标的正确方法吗?这又是让 Stack 结构与我的 LinkedList 数据结构一起运行。

非常感谢您提前提供的帮助和时间!

干杯!


编辑1:

push 方法错误(它是 pop 方法)。还添加了 pop 方法。这些是正确的(上面也已更正)

public void push(){ list.addFirst(obj); } 
public E pop(){ return list.removeFirst(); }

【问题讨论】:

  • Java 已经包含了一个Stack、一个Queue 和一个LinkedList...你为什么要自己写?
  • 基本上我的任务是在不使用 Java 预定义类的情况下复制 LinkedList、Stack 和 Queue 行为。
  • 您的Stack() 构造函数正在调用testStack() 方法,该方法本身正在初始化语句中的堆栈:Stack&lt;Integer&gt; testStack = new Stack&lt;Integer&gt;(); 这将变为递归,您会遇到StackOverflowError
  • 我之前尝试过另一种方法,但我无法真正启动并运行它。我在一个名为 StackTester 的单独文件中创建了另一个类,该文件导入了 package1。在它的默认构造函数中,它实例化了一个 new Stack() 并且还在里面运行了 testStack。您认为这会是更好的方法吗?
  • 我尝试了我告诉你的方法并修复它,现在它根本没有给我任何问题!如何打印 Stack() 实例的所有内容?因为当我执行System.out.println(stack);(在这种情况下,堆栈是new Stack&lt;Integer&gt;() 类型的Stack() 的实例)时,它只显示data_structures.Stack@6f5f6479(地址)。谢谢!

标签: java generics linked-list stack implementation


【解决方案1】:

您已经定义了 Stack 构造函数,如下所示:

Stack(){
    list = new LinkedList<E>();
    testStack();
}

您的testStack() 方法如下所示,缺少()

//My tests to see if the Stack works
public void testStack(){

    Stack<Integer> testStack = new Stack<Integer>();
    //Test push method
    for(int i = 1; i < 100; i++){
        stack.push(new Integer(i));
    }
}//End 

您的Stack() 构造函数正在调用testStack() 方法,该方法本身在语句中初始化一个堆栈:Stack&lt;Integer&gt; testStack = new Stack&lt;Integer&gt;(); 这变成了递归并且您遇到了 StackOverflowError

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 2016-08-15
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多