如何在 Stack/Queue class Java 中实现我的通用 LinkedList
How to implement my generic LinkedList in my Stack/Queue class in Java
我有这个项目,我必须在堆栈和队列 classes 中实现我的 LinkedList 数据结构。包括我的 LinkedList 在内的所有 classes 都是通用类型 <E>
。问题是我遇到了一堆溢出和 nullpointerexceptions 错误。这是我的逻辑:
我的 Stack 和 Queue classes 应该实现我之前写的 LinkedList class,运行s 完美无瑕(我彻底测试过)。我的 LinkedList 同时实现了 LinkedListImplementation,它只包含 "blueprints" 我应该使用的方法。此外,我想说所有这些文件 -> 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 class,但不允许我使用任何来自 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 class,因为一旦我启动 Stack one 并 运行ning,实现 Queue one 将非常容易。
每当我 运行 我的代码时,我都会收到以下错误:
Exception in thread "main" java.lang.WhosebugError
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 循环和我的代码中有某种 class 实例化错误。第一个错误(第 24 行)涉及 LinkedList
class 构造函数。第二个错误(第 9 行)指的是 Stack
class 构造函数。第三个错误(第25行)是指runTests()
方法内部栈的实例化,也就是下面这行:Stack<Integer> testStack = new Stack<Integer>();
。第四个错误(第 11 行)指的是 Stack()
class 默认构造函数中的 testStack
调用。
有人可以帮助我找到实现目标的正确方法吗?这又是建立一个 Stack 结构和 运行 我的 LinkedList 数据结构。
非常感谢您的帮助和提前时间!
干杯!
编辑 1:
push方法错误(是pop方法)。还添加了 pop 方法。这些是正确的(上面也更正了)
public void push(){ list.addFirst(obj); }
public E pop(){ return list.removeFirst(); }
您已经定义了 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:Stack<Integer> testStack = new Stack<Integer>();
这变成了递归,您 运行 进入 WhosebugError
我有这个项目,我必须在堆栈和队列 classes 中实现我的 LinkedList 数据结构。包括我的 LinkedList 在内的所有 classes 都是通用类型 <E>
。问题是我遇到了一堆溢出和 nullpointerexceptions 错误。这是我的逻辑:
我的 Stack 和 Queue classes 应该实现我之前写的 LinkedList class,运行s 完美无瑕(我彻底测试过)。我的 LinkedList 同时实现了 LinkedListImplementation,它只包含 "blueprints" 我应该使用的方法。此外,我想说所有这些文件 -> 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 class,但不允许我使用任何来自 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 class,因为一旦我启动 Stack one 并 运行ning,实现 Queue one 将非常容易。
每当我 运行 我的代码时,我都会收到以下错误:
Exception in thread "main" java.lang.WhosebugError
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 循环和我的代码中有某种 class 实例化错误。第一个错误(第 24 行)涉及 LinkedList
class 构造函数。第二个错误(第 9 行)指的是 Stack
class 构造函数。第三个错误(第25行)是指runTests()
方法内部栈的实例化,也就是下面这行:Stack<Integer> testStack = new Stack<Integer>();
。第四个错误(第 11 行)指的是 Stack()
class 默认构造函数中的 testStack
调用。
有人可以帮助我找到实现目标的正确方法吗?这又是建立一个 Stack 结构和 运行 我的 LinkedList 数据结构。
非常感谢您的帮助和提前时间!
干杯!
编辑 1:
push方法错误(是pop方法)。还添加了 pop 方法。这些是正确的(上面也更正了)
public void push(){ list.addFirst(obj); }
public E pop(){ return list.removeFirst(); }
您已经定义了 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:Stack<Integer> testStack = new Stack<Integer>();
这变成了递归,您 运行 进入 WhosebugError