採用單鏈表來保存棧中全部元素,這種鏈式結構的棧稱爲鏈棧。app
1 package com.ietree.basic.datastructure.stack; 2 3 /** 4 * 鏈棧 5 * 6 * Created by ietree 7 * 2017/4/29 8 */ 9 public class LinkStack<T> { 10 11 // 定義一個內部類Node,Node實例表明鏈棧的節點 12 private class Node { 13 14 // 保存節點的數據 15 private T data; 16 // 指向下個節點的引用 17 private Node next; 18 // 無參構造器 19 public Node() { 20 } 21 // 初始化所有屬性的構造器 22 public Node(T data, Node next) { 23 24 this.data = data; 25 this.next = next; 26 27 } 28 29 } 30 // 保存該鏈棧的棧頂元素 31 private Node top; 32 // 保存該鏈棧中已包含的節點數 33 private int size; 34 // 建立空鏈棧 35 public LinkStack() { 36 // 空鏈棧,top的值爲null 37 top = null; 38 39 } 40 41 // 以指定數據元素來建立鏈棧,該鏈棧只有一個元素 42 public LinkStack(T element) { 43 44 top = new Node(element, null); 45 size++; 46 47 } 48 49 // 返回鏈棧的長度 50 public int length() { 51 52 return size; 53 54 } 55 56 // 進棧 57 public void push(T element) { 58 59 // 讓top指向新建立的元素,新元素的next引用指向原來的棧頂元素 60 top = new Node(element, top); 61 size++; 62 63 } 64 65 // 出棧 66 public T pop() { 67 68 Node oldTop = top; 69 // 讓top引用指向原棧頂元素的下一個元素 70 top = top.next; 71 // 釋放原棧頂元素的next引用 72 oldTop.next = null; 73 size--; 74 return oldTop.data; 75 76 } 77 78 // 訪問棧頂元素,但不刪除棧頂元素 79 public T peek(){ 80 81 return top.data; 82 83 } 84 85 // 判斷鏈棧是否爲空棧 86 public boolean empty() { 87 88 return size == 0; 89 90 } 91 92 // 請空鏈棧 93 public void clear() { 94 95 top = null; 96 size = 0; 97 98 } 99 100 public String toString() { 101 102 // 鏈棧爲空棧時 103 if (empty()) { 104 105 return "[]"; 106 107 } else { 108 109 StringBuilder sb = new StringBuilder("["); 110 for (Node current = top; current != null; current = current.next) { 111 112 sb.append(current.data.toString() + ", "); 113 114 } 115 116 int len = sb.length(); 117 return sb.delete(len - 2, len).append("]").toString(); 118 } 119 120 } 121 122 }
測試類:測試
1 package com.ietree.basic.datastructure.stack; 2 3 /** 4 * Created by ietree 5 * 2017/4/29 6 */ 7 public class LinkStackTest { 8 9 public static void main(String[] args) { 10 11 LinkStack<String> stack = new LinkStack<String>(); 12 13 stack.push("aaaa"); 14 stack.push("bbbb"); 15 stack.push("cccc"); 16 stack.push("dddd"); 17 System.out.println(stack); 18 19 System.out.println("訪問棧頂元素:" + stack.peek()); 20 21 System.out.println("第一次彈出棧頂元素:" + stack.pop()); 22 23 System.out.println("第二次彈出棧頂元素:" + stack.pop()); 24 25 System.out.println("兩次pop以後的棧:" + stack); 26 27 } 28 29 }
程序輸出:ui
[dddd, cccc, bbbb, aaaa]
訪問棧頂元素:dddd
第一次彈出棧頂元素:dddd
第二次彈出棧頂元素:cccc
兩次pop以後的棧:[bbbb, aaaa]