除了我之前一篇文章中介绍的栈的顺序存储,就是底层使用一个数组存储数据元素。其实也是可以使用单链表存储栈中的数据, 然后使用一个top引用来记录栈顶元素
进栈:top指向新添加的元素, 新元素的引用指向原来的栈顶元素 size + 1。
进栈:top指向新添加的元素, 新元素的引用指向原来的栈顶元素 size + 1。
出栈: top指向原栈顶元素的下一位元素, 使用原来的栈顶元素 size - 1。
图示其过程(制作粗糙,请见谅):
参考代码:
public class LinkStack<T> {
//定义一个节点类
private class Node{
//保存数据
private T data;
//下一个节点域
private Node next;
public Node(){
}
public Node(T data, Node next){
this.data = data;
this.next = next;
}
}
//保存栈顶元素
private Node top;
//栈中的元素个数(节点数)
private int size;
//创建空链表
public LinkStack(){
top = null;
}
//根据指定元素创建新的栈
public LinkStack(T element){
top = new Node(element, null);//创建每一个元素是以节点的形式出现的
size ++;
}
//返回栈的长度
public int length(){
return size;
}
//进栈
public void push(T element){
top = new Node(element, top);
size ++;
}
//出栈
public T pop(){
Node oldTop = top;
top = top.next;
//释放原栈顶元素的引用
oldTop.next = null;
size --;
return oldTop.data;
}
//返回栈顶元素
public T peek(){
return top.data;
}
//判断是否为空
public boolean empty(){
return size == 0;
}
//清空顺序栈
public void clear(){
top = null;
size = 0;
}
public String toString(){
if(size == 0){
return "[]";
}
else{
StringBuffer sb = new StringBuffer();
sb.append("[");
for(Node current = top; current != null; current = current.next){ //LIFO
sb.append(current.data.toString() + ", ");
}
int len = sb.length();
return sb.delete(len - 2, len).append("]").toString();
}
}
}
测试部分:
public static void main(String[] args) {
LinkStack<Integer> ls = new LinkStack<Integer>();
ls.push(11);
ls.push(22);
ls.push(33);
ls.push(44);
System.out.println("栈为:" + ls);
System.out.println("栈顶元素是:" + ls.peek());
ls.pop();
System.out.println("删除栈顶后的栈为:" + ls);
System.out.println("新的栈弹出的元素是:" + ls.pop());
}
参考:《疯狂java 突破程序员基本功的16课》
以上是这篇的内容,如果有错误的地方或需要改进的地方,请您指出。谢谢!