Java 使用链表实现栈及性能比较
使用链表作为底层来实现栈。
本文不对栈接口及ArraysStack的代码以及以动态数组的代码进行展示,有兴趣可以阅读我之前的文章:
https://blog.****.net/qq_41723615/article/category/8540172
链表栈的实现:
public class LinkedListStack<E> implements Stack<E> {
//私有链表头对象
private LinkedList<E> list;
public LinkedListStack(){
//初试化链表
list = new LinkedList<>();
}
@Override
public int getSize(){
return list.getSize();
}
@Override
public boolean isEmpty(){
return list.isEmpty();
}
@Override
public void push(E e){
list.addFirst(e);
}
@Override
public E pop(){
return list.removeFirst();
}
@Override
public E peek(){
return list.getFirst();
}
@Override
public String toString(){
StringBuilder res = new StringBuilder();
res.append("Stack: top ");
res.append(list);
return res.toString();
}
public static void main(String[] args) {
LinkedListStack<Integer> stack = new LinkedListStack<>();
for(int i = 0 ; i < 5 ; i ++){
stack.push(i);
System.out.println(stack);
}
stack.pop();
System.out.println(stack);
}
}
输出效果:
下面来比较下之前的数组栈与现在的链表栈的性能差距:
import java.util.Random;
public class Main {
// 测试使用stack运行opCount个push和pop操作所需要的时间,单位:秒
private static double testStack(Stack<Integer> stack, int opCount){
long startTime = System.nanoTime();
Random random = new Random();
for(int i = 0 ; i < opCount ; i ++) {
stack.push(random.nextInt(Integer.MAX_VALUE));
}
for(int i = 0 ; i < opCount ; i ++) {
stack.pop();
}
long endTime = System.nanoTime();
return (endTime - startTime) / 1000000000.0;
}
public static void main(String[] args) {
int opCount = 100000;
ArrayStack<Integer> arrayStack = new ArrayStack<>();
double time1 = testStack(arrayStack, opCount);
System.out.println("ArrayStack, time: " + time1 + " s");
LinkedListStack<Integer> linkedListStack = new LinkedListStack<>();
double time2 = testStack(linkedListStack, opCount);
System.out.println("LinkedListStack, time: " + time2 + " s");
// 其实这个时间比较很复杂,因为LinkedListStack中包含更多的new操作
}
}
运行结果:
如果new的节点比较多,则链表栈的性能会比数组栈的性能要差一些。因为每次都要开辟新的内存空间。不过两者的性能是差不多的。