Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通用堆栈数组_Java_Arrays_Generics_Stack - Fatal编程技术网

Java 通用堆栈数组

Java 通用堆栈数组,java,arrays,generics,stack,Java,Arrays,Generics,Stack,我必须实现一个通用堆栈,但是当我尝试构建项目时,我有一个错误,我无法理解。代码如下: Stack.java->接口 package stack; public interface Stack <T> { public boolean isEmpty(); public boolean isFull(); public void push(T x) throws StackFullException; public boolean offer(T x)

我必须实现一个通用堆栈,但是当我尝试构建项目时,我有一个错误,我无法理解。代码如下:

Stack.java->接口

package stack;

public interface Stack <T> {
    public boolean isEmpty();
    public boolean isFull();
    public void push(T x) throws StackFullException;
    public boolean offer(T x);
    public T pop() throws StackEmptyException;
    public T poll();
    public T peek() throws StackEmptyException;
    public T element();
}
package stack;

public class StackArray <T extends Number> implements Stack {
    static int max;
    private int nr;
    private T[] stack;

    public StackArray(int size){
        nr=0;
        stack=(T[])(new Object[size]);
        max=size;
    }
    public boolean isEmpty() {
        if (nr<=0)
            return true;
        return false;
    }
    public boolean isFull() {
        if (nr==max-1)
            return true;
        return false;
    }
    public void push(Object x) throws StackFullException{
        if(isFull())
            throw new StackFullException();
        else
            stack[nr++]=(T)x;
    }
    public boolean offer(Object x) {
        if(isFull())
            return false;
        else
        {
            stack[nr++]=(T)x;
            return true;
        }
    }

    public T pop() throws StackEmptyException {
        T aux=(T)(new Object());
        if(isEmpty())
            throw new StackEmptyException();
        else
            {
                aux=stack[nr];
                stack[nr]=null;
                nr--;
                return aux;
            }
        }

    public T poll() {
        T aux=(T)(new Object());
        if(isEmpty())
            return null;
        else
        {
             aux=stack[nr];
             stack[nr]=null;
             nr--;
             return aux;
        }

    }

    public T peek() throws StackEmptyException {
        if(isEmpty())
            throw new StackEmptyException();
        else
            return stack[nr];
    }

    public T element() {
        if(isEmpty())
            return null;
        else
            return stack[nr];
    }

}
包栈;
公共接口栈{
公共布尔值为空();
公共布尔值为full();
公共无效推送(TX)抛出StackFullException;
公开募股(tx);
public T pop()抛出StackEmptyException;
公众投票(;
public T peek()抛出StackEmptyException;
公共T元素();
}
StackArray.java->接口的实现

package stack;

public interface Stack <T> {
    public boolean isEmpty();
    public boolean isFull();
    public void push(T x) throws StackFullException;
    public boolean offer(T x);
    public T pop() throws StackEmptyException;
    public T poll();
    public T peek() throws StackEmptyException;
    public T element();
}
package stack;

public class StackArray <T extends Number> implements Stack {
    static int max;
    private int nr;
    private T[] stack;

    public StackArray(int size){
        nr=0;
        stack=(T[])(new Object[size]);
        max=size;
    }
    public boolean isEmpty() {
        if (nr<=0)
            return true;
        return false;
    }
    public boolean isFull() {
        if (nr==max-1)
            return true;
        return false;
    }
    public void push(Object x) throws StackFullException{
        if(isFull())
            throw new StackFullException();
        else
            stack[nr++]=(T)x;
    }
    public boolean offer(Object x) {
        if(isFull())
            return false;
        else
        {
            stack[nr++]=(T)x;
            return true;
        }
    }

    public T pop() throws StackEmptyException {
        T aux=(T)(new Object());
        if(isEmpty())
            throw new StackEmptyException();
        else
            {
                aux=stack[nr];
                stack[nr]=null;
                nr--;
                return aux;
            }
        }

    public T poll() {
        T aux=(T)(new Object());
        if(isEmpty())
            return null;
        else
        {
             aux=stack[nr];
             stack[nr]=null;
             nr--;
             return aux;
        }

    }

    public T peek() throws StackEmptyException {
        if(isEmpty())
            throw new StackEmptyException();
        else
            return stack[nr];
    }

    public T element() {
        if(isEmpty())
            return null;
        else
            return stack[nr];
    }

}
包栈;
公共类StackArray实现堆栈{
静态int max;
私人国际天然气公司;
私有T[]栈;
公共堆栈数组(整数大小){
nr=0;
堆栈=(T[])(新对象[大小];
最大值=尺寸;
}
公共布尔值为空(){

如果(nr尝试将Main.java的第5行更改为:

StackArray stiva=新的StackArray(10);

(或者其他一些扩展数字的类型,如果您将StackArray标记为的话)的
T[]
的上界是
Number[]
,因为
T
的上界是
Number
。因此您的
堆栈实际上被声明为
Number[]
而不是
对象[]
。在构造函数中,您试图将
对象[]
分配给
堆栈
。请创建一个
编号[]

stack=(T[])(new Number[size]);
顺便说一句,你可能想

public class StackArray <T extends Number> implements Stack<T>
公共类StackArray实现堆栈
您不应该实现类的原始版本。因此,您需要更新其他方法(例如,
push(t)
而不是
push(Object)
)。

更改

public void push(Object x)


我已经做了这些更改,现在出现了以下错误:线程“main”java.lang.ClassCastException中的异常:java.lang.Object不能在stack.StackArray.pop(StackArray.java:40)的stack.main.main(main.java:9)处转换为java.lang.Number。java结果:1第40行是T aux=(T) (new Object());为什么要尝试创建一个新对象,然后重新分配变量?Jus do
T aux;
-无需初始化它(更不用说它是错误的)@Ionut:@Peter是对的。你完全没有理由需要在那里创建一个对象。@Peter Knego:谢谢!这就是问题所在。我已经改成了简单的T aux并开始工作。问题已经解决了!@Ionut:你有什么理由不想使用Java提供的
Stack
ArrayDeque
吗?你有什么特别的理由不想使用[Stack][1]或者[Deque][2]的实现?[1]:[2]:还有一件事;
max
为空似乎没有什么好的理由;事实上,如果人们同时使用堆栈的两个实例,那么代码可能会灾难性地失败。
public void push(Number x) //or T