我什么时候应该使用java.util.Stack vs My Own Implementation?

时间:2017-12-21 22:17:54

标签: java data-structures stack queue

所以我很困惑,需要一个建议。在Java中,我可以实现自己的Stack,或者我可以使用java.util提供的那个。

手册

public class stack {

private int maxSize; //max size of stack
private char[] stackArray;
private int top; //index poistion of last element

public stack(int size){
    this.maxSize=size;

    this.stackArray=new char[maxSize];
    this.top=-1; //    
}


public void push(char j){

    if (isFull()) {
        System.out.println("SORRY I CANT PUSH MORE");
    }else{

    top++;
    stackArray[top]=j;
    }
}

public char pop(){

    if(isEmpty()){
        System.out.println("Sorry I cant pop more!");
        return '0';
    }else{

       int oldTop=top;
    top--;
    return stackArray[oldTop];

    }
}


public char peek(){
    if(!isEmpty()) {
        return stackArray[top];
    }
}


public boolean isEmpty(){
    return (top==-1);
}

public boolean isFull(){
    return (maxSize-1 == top);
}

第二种方式是 Java Libraries

Stack<String> stacky = new Stack<>();

队列的实现具有相同的情况。 而且,我不知道在哪种情况下使用哪种情况。

2 个答案:

答案 0 :(得分:7)

一般来说,您永远不应该使用自己在Java运行时库中已有的东西的实现,因为该代码的测试方式比您的代码可能被测试的更多。

另外,一般来说,您永远不应该使用旧版java.util.Stack类,因为它是synchronized。正如Stack的javadoc所说:

  

Deque接口及其实现提供了一套更完整,更一致的LIFO堆栈操作,应该优先于此类使用 。例如:

Deque<Integer> stack = new ArrayDeque<Integer>();

无论如何,对于您的问题&#34;在Java中实现堆栈的方式有多少?&#34; ,Java运行时库中有5个堆栈实现:

当然,任何List实现都可以用作堆栈,但没有方便的方法,例如对于ArrayList,您希望使用list.add(list.size(), e)将元素推送到&#34;堆栈&#34;。

答案 1 :(得分:0)

在生产代码中,您始终可以使用Java库中提供的实现。自己实现它的唯一原因是出于教育目的(了解数据结构内部如何工作)。

作为Java一部分的实现(如java.util.Stackjava.util.ArrayList等)经过了充分测试,并且已知可以正常运行,并且可以轻松地包含在任何项目中。另一方面,您自己的实现更有可能包含错误,并且代码将不具备可移植性,因为它可能使用非标准功能。