Java实现的链栈数据结构
LinkNode(节点)—封装—>LinkList(链表)—封装—>LinkStack(链栈)
基本的数据单元 节点
LinkNode.java
/**
* 链表的核心,节点
*
* @author mingwei
*
*/
public class LinkNode {
/**
* 用来存储节点要存储的数据
*/
Object mData;
/**
* 用来指向当前节点的下一个节点
*/
LinkNode mNext;
/**
* 节点的构造方法
*
* @param data
* 节点存储的数据
*/
public LinkNode(Object data) {
mData = data;
}
}
链表结构,从头部插入和删除节点
/**
* 链表,有一个头结点
*
* 在链表的头部插入一个节点的方法 ->addHeadNode
*
* 删除链表头部的一个节点的方法->removeHeadNode
*
* @author mingwei
*
*/
public class LinkList {
/**
* 链表的名字
*/
String mName;
/**
* 头结点
*/
LinkNode mHeadNode;
/**
* 构造方法,传入链表的名字
*
* @param name
*/
public LinkList(String name) {
mName = name;
}
/**
* 添加一个头结点的
*
* 步骤:
*
* 1.创建一个节点
*
* 2.把原来头结点赋值到创建的这个节点的next上
*
* 3.头节点引用指向这个新假如的新节点
*
* @param data
* 添加的新节点的数据
*/
public void addHead(Object data) {
LinkNode node = new LinkNode(data);
node.mNext = mHeadNode;
mHeadNode = node;
}
/**
* 移除一个头结点
*
* 步骤:
*
* 1.头结点赋值给一个临时的节点
*
* 2.头结点引用指向的节点向后挪一位,其实上一个节点并没有删除,上一个节点还存在,只是链表的特殊性从前往后找,
* 这样一来头结点前面的节点就已经无法在找到了
*
* @return
*/
public Object removeHead() {
if (mHeadNode == null) {
throw new IndexOutOfBoundsException(mName + "'s headnode is null");
}
LinkNode temp = mHeadNode;
mHeadNode = mHeadNode.mNext;
return temp.mData;
}
/**
* 打印当前的链表
*
* 步骤:从头结点循环打印链表的所有数据
*/
public void printLinkList() {
if (mHeadNode == null) {
System.out.println(mName + "=linklist is null");
return;
}
LinkNode node = mHeadNode;
System.out.print(mName + "=");
while (node != null) {
System.out.print(node.mData + "|");
node = node.mNext;
}
System.out.print("\n");
}
}
/**
* 使用链表实现一个链栈
*
* push 压栈
*
* pop 出栈
*
* @author mingwei
*
*/
public class LinkStack {
/**
* 存储链栈的所有数据,以链表的形式
*/
LinkList mLinkList = new LinkList("链栈");
/**
* 入栈
*/
public void push(Object node) {
mLinkList.addHead(node);
}
/**
* 出栈
*
* @return 当前移除的栈
*/
public Object pop() {
return mLinkList.removeHead();
}
/**
* 打印链表
*/
public void printStack() {
mLinkList.printLinkList();
}
}
使用:
public class Test {
public static void main(String[] args) {
LinkStack stack = new LinkStack();
stack.push("a");
stack.push("b");
stack.push("a");
stack.printStack();
stack.pop();
stack.printStack();
}
}
结果:
链栈=a|b|a|
链栈=b|a|