概述:实现一个LIFO(后进先出)的栈
实现思路:
可以用数组和链表来实现:数组长度是固定的,一旦定义无法改变,所以需要预先定义一个默认的数组长度,当栈容量到达一定程度后,需要重新定义一个数组,并将当前数组的数据复制到新数组中,当栈元素很多的时候,效率会比较低;用链表实现,入栈和出栈都在链表的头部添加和删除元素,入栈出栈的效率和栈数据大小无关,所以我们选择用链表实现栈。
实现:
public class MyStack<T> {
/**
* 节点类
*/
private class Node<T> {
T node;
Node<T> next;
Node(T node) {
this.node = node;
}
}
/**
* 头节点
*/
private Node<T> first;
/**
* 栈大小
*/
private int size = 0;
/**
* 判断栈是否为空
*
* @return 栈是否为空,为空返回true,否则false
*/
public boolean isEmpty() {
return size == 0;
}
/**
* 返回栈大小
*
* @return 栈大小
*/
public int size() {
return size;
}
/**
* 入栈
*
* @param 需入栈的元素
*/
public void push(T node) {
Node<T> oldFirst = first;
first = new Node<T>(node);
first.next = oldFirst;
size++;
}
/**
* 出栈
*
* @return 当前栈顶元素
*/
public T pop() {
if (size > 0) {
T result = first.node;
first = first.next;
size--;
return result;
} else {
return null;
}
}
}