Java 通用堆栈方法
我使用以下方法创建这个堆栈类,如图所示Java 通用堆栈方法,java,generics,methods,stack,static-typing,Java,Generics,Methods,Stack,Static Typing,我使用以下方法创建这个堆栈类,如图所示 import java.util.ArrayList; import java.util.EmptyStackException; public class SortableStack<E extends Comparable<E>> implements ISortableStack<E> { private int N; private Nod
import java.util.ArrayList;
import java.util.EmptyStackException;
public class SortableStack<E extends Comparable<E>> implements ISortableStack<E> {
private int N;
private Node first;
private class Node {
private E e;
private Node next;
}
public SortableStack() {
first = null;
N = 0;
}
private ArrayList<E> listOne = new ArrayList<E>();
public boolean isEmpty() {
return first == null;
}
public int size() {
return N;
}
public void push(E e) {
Node oldfirst = first;
first = new Node();
first.e = e;
first.next = oldfirst;
N++;
}
public E pop() {
if (isEmpty()) throw new RuntimeException("Stack underflow");
E e = first.e; // save e to return
first = first.next; // delete first node
N--;
return e; // return the saved e
}
public E peekMidElement() {
if(listOne.size() <= 0){
throw new EmptyStackException();
}
return listOne.get(listOne.size()/2);
}
public E peekHighestElement() {
if(listOne.size() <= 0){
throw new EmptyStackException();
}
return listOne.get(listOne.size() - 1);
}
public E peekLowestElement() {
if(listOne.size() <= 0){
throw new EmptyStackException();
}
return listOne.get(0);
}
}`
import java.util.ArrayList;
导入java.util.EmptyStackException;
公共类SortableStack实现了ISortableStack{
私人int N;
私有节点优先;
私有类节点{
私人E;
私有节点下一步;
}
公共SortableStack(){
第一个=空;
N=0;
}
private ArrayList listOne=new ArrayList();
公共布尔值为空(){
返回first==null;
}
公共整数大小(){
返回N;
}
公共空间推送(E){
节点oldfirst=第一个;
第一个=新节点();
第一,e=e;
first.next=oldfirst;
N++;
}
公共E-pop(){
if(isEmpty())抛出新的RuntimeException(“堆栈下溢”);
E=first.E;//保存E以返回
first=first.next;//删除第一个节点
N--;
return e;//返回保存的e
}
公共电子元件(){
if(listOne.size()
现在,SortableStack
中的E
是一个类型参数:它是某个特定类的占位符,比如String
。您不需要指定E
作为该类的用户,而是需要告诉编译器该实例的E
应该映射到什么。看起来堆栈需要保存字符,所以至少你真正想要的是:
ISortableStack<Character> s = new SortableStack<Character>();
char character;
while ( (character = (char)System.in.read()) != '\n') {
//...
s.push(character);
}
ISortableStack s=new SortableStack();
字符;
而((character=(char)System.in.read())!='\n'){
//...
s、 推(字);
}
您不需要ch
成为该特定行的demo
成员(ISortableStack s=new ISortableStack(5);
)有几件事正在进行
让我们一个接一个地把它们分类:
ISortableStack是原始类型。对泛型类型的引用
应参数化ISortableStack
这里的问题是您正在尝试使用原始类型。下一步是将其参数化:
无法实例化类型ISortableStack
您正在尝试创建接口的实例-这当然会失败。请改用类
无法对非静态类型E进行静态引用
类型参数不能用于main
方法所使用的任何静态上下文中
除此之外,您似乎缺少部分代码…我想您是想编写ISortableStack s=new SortableStack();您在这里没有泛型问题,无法实例化接口。您只能实例化ISortableStack的实现。我知道这是一个Q+a站点,任何人都可以自由提问,但您不会通过让他人解决您的任务来学习如何编程。我希望您能从中学习回答。谢谢你的回答,德鲁。但是,我从这本书中学到的东西比从其他任何一本教科书中学到的都多。感谢@ZenMaster、@Mark Peters,甚至你给了我如此真挚的见解。就完成任务而言,我很高兴至少我自己也在努力解决它。好吧,如果你能做到这一点,请告诉我们在这次考试中,Yonathan。向Yoshiro问好。确保你在应该得到表扬的地方给予表扬。击败我:)@Yonathan除此之外,你还将遇到一个问题,因为你没有一个构造函数接受int
。我肯定,我会的。有任何关于改进代码的建议吗?+1解释足够详细的答案,以便OP了解所发布代码的真正错误。我是否错过了排序表tack(int)构造函数?
ISortableStack<E> s = new ISortableStack(5); //Cannot instatiate ISORTABLESTACK
ISortableStack<E> s = new SortableStack<E>();
ISortableStack<Character> s = new SortableStack<Character>();
char character;
while ( (character = (char)System.in.read()) != '\n') {
//...
s.push(character);
}