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]
如果文章对你有所帮助的话,请点个推荐或者关注吧。也希望你能够养成分享的习惯,从而去帮助其他人。