十三 用鏈表實現棧
阿新 • • 發佈:2018-11-20
pre st2 用例 art ima rcv int opc d+
用鏈表實現棧:
鏈表棧:
package com.lt.datastructure.stackqueue; /* * 使用鏈表實現棧 */ public class LinkedListStack<E> implements Stack<E> { LinkedList<E> list; LinkedListStack(){ list = new LinkedList<>(); } @Override public int getsize() { returnlist.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("pop: \n"+stack); } }
測試:
和數組棧比較:
測試用例:
package com.lt.datastructure.stackqueue; 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操作 } }
測試結果:鏈表棧比數組棧快一些,但沒有復雜度上的巨大差異
十三 用鏈表實現棧