栈的链式存储结构
我们知道栈是特殊的线性表,那么栈的链式存储和单链表很相似,就是简化版的单链表,top是头指针,插入完成之后要将头指针指向栈顶元素。
链栈的代码实现
结点结构
public class Node<T> {
T data;
Node<T> next;
public Node(T value){
data = value;
next = null;
}
public Node(){}
}
链栈代码
public class MyLinkedStack<T> {
private Node<T> top;
int size;
public MyLinkedStack(){
top = new Node<>();
}
//判栈空
public boolean isEmpty(){
return size == 0;
}
//入栈
public void push(T value){ //头插法
Node<T> n= new Node<>(value);
n.next = top;
top = n;
size++;
}
//出栈
public T pop(){
if (!isEmpty()){
Node temp = top;
T data = (T)top.data;
top = top.next;
temp = null; //防止内存泄漏
size--;
return data;
}else{
throw new NullPointerException();
}
}
//获取栈顶元素
public T peek(){
if (!isEmpty()) {
return top.data;
}else {
throw new NullPointerException();
}
}
//获取栈的上一个元素
public T last(){
if (!isEmpty() && top.next != null){
return top.next.data;
}else{
throw new NullPointerException();
}
}
//获取栈的大小
public int size(){
return size;
}
//打印栈
public void show(){
Node temp = top;
while (temp != null){
System.out.println(temp.next.data);
temp = temp.next;
}
}
}
测试代码
public class Test {
public static void main(String[] args) {
MyLinkedStack<String> myLinkedStack = new MyLinkedStack<>();
myLinkedStack.push("aaa");
myLinkedStack.push("bbb");
myLinkedStack.push("ccc");
// myLinkedStack.pop();
// myLinkedStack.show();
System.out.println(myLinkedStack.peek());
System.out.println(myLinkedStack.last());
}
}
注:
栈的使用过程元素变化不可预料,有时很小,有时很大,最好使用链栈,如果变化在可控范围之内,建议使用顺序栈。