package com.myTest.stack;
/**
* 单链表实现栈的链式存储结构
*
* @param <T>
*/
public class LinkStack<T> {
public static void main(String[] args) {
LinkStack<Integer> linkStack = new LinkStack<>();
linkStack.push(1);
linkStack.push(2);
linkStack.push(3);
linkStack.push(4);
linkStack.push(5);
linkStack.push(6);
System.out.println(linkStack);
System.out.println(linkStack.pop());
System.out.println(linkStack+ " 元素个数:"+linkStack.size());
linkStack.push(8);
linkStack.push(10);
System.out.println(linkStack+ "元素个数:"+linkStack.size());
}
//栈顶节点
private Node<T> preFirst;
//栈当前空间大小
private static int size = 0;
public int size() {
return size;
}
/**
* 栈节点
*
* @param <T>
*/
public static class Node<T> {
Node<T> next;
T data;
public Node(T e, Node<T> nextNode) {
this.next = nextNode;
this.data = e;
}
private Node() {
}
}
/**
* 压栈,不断从头结点插入元素
*
* @param e 元素
*/
public synchronized void push(T e) {
if (preFirst == null) {
preFirst = new Node(e, null);
} else {
preFirst = new Node(e, preFirst);
}
size++;
}
/**
* 弹栈
*
* @return 返回栈顶元素
*/
public synchronized T pop() {
T data = null;
if (preFirst != null) {
Node<T> oldNode=preFirst;
data = oldNode.data;
if (preFirst.next != null) {
//从头结点开始下移
preFirst = preFirst.next;
} else {
preFirst = null;
}
oldNode.next=null;
size--;
}
return data;
}
@Override
public String toString() {
String result = "[";
Node<T> currentNode = preFirst;
while (currentNode != null) {
result = result + "," + currentNode.data;
currentNode = currentNode.next;
}
result = result.replaceFirst(",", "");
result = result + "]";
return result;
}
}