Java棧之鏈式棧儲存結構實現,java鏈式結構
一、鏈棧
採用單鏈表來儲存棧中所有元素,這種鏈式結構的棧稱為鏈棧。
二、棧的鏈式儲存結構實現
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 }
程式輸出:
[dddd, cccc, bbbb, aaaa]訪問棧頂元素:dddd第一次彈出棧頂元素:dddd第二次彈出棧頂元素:cccc兩次pop之後的棧:[bbbb, aaaa]