数据结构——链栈

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出栈操作
/**
 * 使用链表实现一个链栈
 * 
 * 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|



你可能感兴趣的:(链栈)