栈是一种先进后出的数据结构,而链表有一个很大的特点:在链表头部增加/删除节点只需要O(1)的时间复杂度,利用这个特点可以设计出O(1)时间复杂度的链表实现栈
实现的时候还是先写一个接口类Stack,把一些操作定义在里面.然后写一个LinkedList类,实现链表的基本操作.再写一个LinkedListStack类,实现Stack接口,复用LinkedList类的实现方法并完成代码测试即可
具体代码如下:
Stack接口类:
public interface Stack<E> {
public void push(E e);
public E pop();
public E peek();
public int getSize();
public boolean isEmpty();
}
LinkedList`链表类:
/**
* 链表类
* @author ChenZhuJi
*
* @param <E>
*/
public class LinkedList<E> {
//私有的内部类,仅在这个类中能够使用,表示一个节点
private class Node {
public E e; //节点中存储的数据
public Node next; //下一个节点
public Node(E e,Node next) {
this.e = e;
this.next = next;
}
public Node() {
this(null,null);
}
@Override
public String toString() {
return e.toString();
}
}
private Node head; //头节点
private int size; //链表的长度
public LinkedList() {
head = new Node();
size = 0;
}
/**
* 获取链表的长度
* @return 链表长度
*/
public int getSize() {
return size;
}
/**
* 获取链表中指定索引的元素
* @param index 索引值
* @return 元素值
*/
public E get(int index) {
if(index >= size || index < 0) {
throw new IllegalArgumentException("索引值不存在或索引越界");
}
Node pre = head;
for(int i = 0; i < index;i++) {
pre = pre.next;
}
return pre.e;
}
/**
* 获取链表的表头元素
* @return 表头元素
*/
public E getFirst() {
return get(0);
}
/**
* 判断链表是否为空
* @return 链表是否为空
*/
public boolean isEmpty() {
return size ==0;
}
/**
* 在链表头添加一个元素
* @param e 要添加的元素
*/
public void addFirst(E e) {
head = new Node(e,head);
size++;
}
/**
* 删除链表头元素
* @return 被删除的元素
*/
public E removeFirst() {
Node ret = head;
head = head.next;
size --;
return ret.e;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[ ");
Node pre = head;
for(int i = 0; i < size - 1; i++) {
sb.append(pre.e + "->");
pre = pre.next;
}
sb.append(pre.e +" ]");
return sb.toString();
}
}
LinkedListStack链栈实现类:
public class LinkedListStack<E> implements Stack<E> {
private LinkedList<E> list;
public LinkedListStack() {
list = new LinkedList<E>();
}
@Override
public void push(E e) {
list.addFirst(e);
}
@Override
public E pop() {
return list.removeFirst();
}
@Override
public E peek() {
return list.getFirst();
}
@Override
public int getSize() {
return list.getSize();
}
@Override
public boolean isEmpty() {
return list.isEmpty();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("LinkedListStack : size = "+ list.getSize()+" ");
sb.append(list.toString());
return sb.toString();
}
public static void main(String[] args) {
LinkedListStack<Integer> lls = new LinkedListStack<Integer>();
for(int i = 0; i <8; i++) {
lls.push(i);
System.out.println(lls);
}
lls.pop();
System.out.println(lls);
}
}