使用链表实现栈
这篇文章使用数组实现了栈(实现泛型接口,更加地面向对象),本文使用链表(链式存储结构实现栈)。
链表是基于 Node 类实现。
a linked list is a recursive data structure that is either empty(null) or a reference to a node having a generic item and a reference to a linked list
Node 类实现如下:
private class Node{
/**
* 当前元素
*/
Item item;
/**
* 下一个元素的指针
*/
Node next;
}
由于栈是先入后出的特征,入栈操作可转化为在链表头插入元素,出栈操作可转化为删除链表头结点,因此只需要一个链接结点即可表示栈,然后再用一个整型变量n表示栈的长度。
基于链表的栈实现如下:
public class Stack<Item> {
/**
* top of stack
*/
private Node first;
/**
* number of items
*/
private int n;
public void push(Item item) {
//相当于往链表的头结果插入一个元素
Node oldFirst = first;
first = new Node();
first.item = item;
first.next = oldFirst;
//栈中的元素数量加1
n++;
}
public Item pop() {
//相当于删除链表的头结点
if (n == 0) {
throw new RuntimeException("栈为空,不能出栈");
}
Item item = first.item;
first = first.next;
n--;
return item;
}
public int size() {
return n;
}
public boolean isEmpty() {
return n == 0 ? true : false;
}
private class Node{
/**
* 当前元素
*/
Item item;
/**
* 下一个元素的指针
*/
Node next;
}
public static void main(String[] args) {
Stack<Integer> mystack = new Stack<>();
mystack.push(1);
mystack.push(2);
mystack.push(3);
System.out.println(mystack.size());
System.out.println(mystack.isEmpty());
System.out.println(mystack.pop());
System.out.println(mystack.pop());
System.out.println(mystack.pop());
System.out.println(mystack.size());
System.out.println(mystack.isEmpty());
System.out.println(mystack.pop());
}
}