Java实现栈Stack_栈内部使用链式存储结构_链式栈
抽象数据类型栈的定义:
栈(stack),是限定在表尾进行插入或删除操作的线性表,因此对栈来说表尾有其特殊的含义,称为栈顶,相应的,表头端称为栈底。不含元素的空表称为空栈。
栈--后进先出(last in first out)
栈-顺序栈-栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素
代码来源:http://zengzhaoshuai.iteye.com/blog/1121238
贴代码:
package hash;
/**
* 栈的链式表示和实现Java实现
*
* @param <T>
*/
public class LinkStack<T> {
//定义一个内部类Node,Node实例代表链栈的节点。
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 count;
//创建空链栈
public LinkStack() {
//空链栈,top的值为null
top = null;
}
//以指定数据元素来创建链栈,该链栈只有一个元素
public LinkStack(T element) {
top = new Node(element, null);
count++;
}
//返回链栈的长度
public int length() {
return count;
}
//进栈
public void push(T element) {
//让top指向新创建的元素,新元素的next引用指向原来的栈顶元素
top = new Node(element, top);
count++;
}
//出栈
public T pop() {
Node oldTop = top;
//让top引用指向原栈顶元素的下一个元素
top = top.next;
//释放原栈顶元素的next引用
oldTop.next = null;
count--;
return oldTop.data;
}
//访问栈顶元素,但不删除栈顶元素
public T peek() {
return top.data;
}
//判断链栈是否为空栈
public boolean empty() {
return count == 0;
}
//清空链栈
public void clear() {
//将底层数组所有元素赋为null
top = null;
count = 0;
}
public String toString() {
//链栈为空链栈时
if (empty()) {
return "[]";
} else {
StringBuilder sb = new StringBuilder("[");
for (Node current = top; current != null; current = current.next) {
sb.append(current.data.toString() + ",");
}
int len = sb.length();
return sb.delete(len - 2, len).append("]").toString();
}
}
public static void main(String args[]) {
LinkStack<String> stringLinkStack = new LinkStack<String>();//创建一个空栈
for (int i = 0; i < 100; i++) {
stringLinkStack.push("lyx" + i);
}
for (int i = 0; i < 20; i++) {
System.out.println(stringLinkStack.pop());
}
System.out.println("=======================");
for (int i = 0; i < 20; i++) {
System.out.println(stringLinkStack.peek());
}
}
}
==============================END==============================