package com.pinjia.shop.common.collection; /** * Created by wangwei on 2017/1/3. */ public class MyLinkedStack<T> { //定义节点数据结构 private class Node{ public T data; public Node next; public Node(){} public Node(T data,Node next){ this.data = data; this.next = next; } } //栈顶元素 private Node top; //元素个数 private int size; //插入元素 public void push(T element){ top = new Node(element,top); size++; } //出栈操作 public T pop(){ Node oldNode = top; top = top.next; //释放引用 oldNode.next = null; size--; return oldNode.data; } //返回栈顶元素,但不出栈 public T peek(){ return top.data; } //栈长度 public int length(){ return size; } //判断链栈是否为空栈 public boolean empty(){ return size == 0; } public String toString(){ //链栈为空时 if(empty()) return "[]"; else{ StringBuilder sb = new StringBuilder("["); for(Node current = top;current != null;current = current.next){ sb.append(current.data.toString()+", "); } int len = sb.length(); return sb.delete(len-2,len).append("]").toString(); } } public static void main(String[] args) { MyLinkedStack<String> stack = new MyLinkedStack<String>(); // 不断地入栈 stack.push("aaaa"); stack.push("bbbb"); stack.push("cccc"); stack.push("dddd"); System.out.println(stack); // 访问栈顶元素 System.out.println("访问栈顶元素:" + stack.peek()); // 弹出一个元素 System.out.println("第一次弹出栈顶元素:" + stack.pop()); // 再次弹出一个元素 System.out.println("第二次弹出栈顶元素:" + stack.pop()); System.out.println("两次pop之后的栈:" + stack); } }
以下是基于数组的实现:
package com.pinjia.shop.common.collection; /** * Created by wangwei on 2017/1/3. */ public class MyArrayStack<T> { private Object[] objs = new Object[16]; private int size = 0; public boolean isEmpty() { return size == 0; } public void clear() { // 将数组中的数据置为null, 方便GC进行回收 for (int i = 0; i < size; i++) { objs[size] = null; } size = 0; } public int length() { return size; } public boolean push(T data) { // 判断是否需要进行数组扩容 if (size >= objs.length) { resize(); } objs[size++] = data; return true; } /** * 数组扩容 */ private void resize() { Object[] temp = new Object[objs.length * 3 / 2 + 1]; for (int i = 0; i < size; i++) { temp[i] = objs[i]; objs[i] = null; } objs = temp; } public T pop() { if (size == 0) { return null; } return (T) objs[--size]; } public String toString() { StringBuilder sb = new StringBuilder(); sb.append("MyArrayStack: ["); for (int i = 0; i < size; i++) { sb.append(objs[i].toString()); if (i != size - 1) { sb.append(", "); } } sb.append("]"); return sb.toString(); } public static void main(String[] args) { MyArrayStack<Integer> stack = new MyArrayStack<Integer>(); stack.push(12); stack.push(13); System.out.println(stack.length()); System.out.println(stack); } }