链表的读取、添加、删除第一个节点的时间复杂度是O(1),所以我们可以用链表来实现一个栈,最关键的是不需要考虑栈的大小,所以链表栈会比数组栈时间复杂度会低。
接口
package blacktv.stack;
/**
* 栈需要实现的一些接口
*/
public interface Stack<E> {
/**
* 入栈
*
* @param e
*/
public void push(E e);
/**
* 出栈,如果没有可出栈的返回null
*
* @return
*/
public E pop();
/**
* 查看栈顶的值是什么,没有则返回null
*
* @return
*/
public E peek();
/**
* 获取栈的大小
*
* @return
*/
public Integer getSize();
/**
* 是否为空,空返回true
*
* @return
*/
public Boolean isEmpty();
}
实现类,使用的链表LinkedList为单向链表编写的
package blacktv.stack;
import blacktv.linkedlist.LinkedList;
/**
* 用链表实现一个栈
*/
public class LinkedListStack<E> implements Stack<E> {
private LinkedList<E> linkedList = new LinkedList<>();
@Override
public void push(E e) {
try {
linkedList.addFirst(e);
} catch (Exception e1) {
e1.printStackTrace();
}
}
@Override
public E pop() {
E e = null;
try {
e = linkedList.deleteFirst();
} catch (Exception e1) {
e1.printStackTrace();
} finally {
return e;
}
}
@Override
public E peek() {
E e = null;
try {
e = linkedList.getFirst();
} catch (Exception e1) {
e1.printStackTrace();
} finally {
return e;
}
}
@Override
public Integer getSize() {
return linkedList.getSize();
}
@Override
public Boolean isEmpty() {
return linkedList.isEmpty();
}
@Override
public String toString() {
String string = "Size:" + linkedList.getSize() + "\tLinkedListStack[";
try {
for (Integer i = 0; i < linkedList.getSize(); i++) {
string += linkedList.get(i).toString();
if (i != linkedList.getSize() - 1)
string += ", ";
}
} catch (Exception e) {
e.printStackTrace();
}
string += "]";
return string;
}
}