继上文栈的简单实现(一)和栈的简单实现(二)实现了顺序结构的栈后,本文为简单实现链式栈结构。
代码如下:
package ds.stack;
import ds.linkedlist.LinkedList;
/**
* 简单链式栈结构
*
* @author Abyss_CMG
*
* @param <E>
*/
public class Stack3<E> {
private LinkedList<E> head = null;// 指向栈顶的头引用
private LinkedList<E> objData = null;// 用于存放数据的链表
private int nLen = 0;// 用于表示栈的长度
Stack3() {
objData = new LinkedList<E>();
}
/**
* 获取栈中已存放数据的长度
*
* @param stack
* 栈的对象引用
* @return 获取栈中已存放数据的长度
*/
int getSize(Stack3<E> stack) {
return stack.nLen;
}
/**
* 判断是否空栈
*
* @param stack
* 栈的对象引用
* @return 若空栈则返回true,否则返回false
*/
boolean isEmpty(Stack3<E> stack) {
return (stack.nLen == 0) ? true : false;
}
/**
* 清空栈,但不释放内存
*
* @param stack
* 栈的对象引用
*/
void clear(Stack3<E> stack) {
stack.head = null;
stack.nLen = 0;
}
/**
* 释放栈的内存空间
*
* @param stack
* 栈的对象引用
*/
void free(Stack3<E> stack) {
if (stack.head == null) {
return;
} else {
stack.head = stack.objData.delete(stack.head,
stack.objData.getHeadInfo(stack.head));
free(stack);
}
clear(stack);
}
/**
* 入栈操作
*
* @param stack
* 栈的对象引用
* @param eData
* 要压入栈的数据
*/
void push(Stack3<E> stack, E eData) {
stack.head = stack.objData.addBeginning(stack.head, eData);
stack.nLen++;
System.out.println(stack.peek(stack) + "已入栈");
}
/**
* 将栈顶弹出
*
* @param stack
* 栈的对象引用
* @return 弹出栈顶数据
*/
E pop(Stack3<E> stack) {
if (isEmpty(stack)) {
System.out.println("栈已空,无法出栈");
return null;
}
E dataTmp = stack.objData.getHeadInfo(stack.head);
stack.head = stack.objData.delete(head, dataTmp);
stack.nLen--;
return dataTmp;
}
/**
* 读取栈顶数据(不弹出)
*
* @param stack
* 栈的对象引用
* @return 返回栈顶元素
*/
E peek(Stack3<E> stack) {
if (isEmpty(stack)) {
System.out.println("栈已空,无法读取栈顶元素");
return null;
}
E dataTmp = stack.objData.getHeadInfo(stack.head);
System.out.println(dataTmp + "已读取");
return dataTmp;
}
}
测试代码:
package ds.stack;
public class Simple3 {
public static void main(String[] args) {
System.out.println("----新建空栈----");
Stack3<String> stack = new Stack3<String>();
System.out.println("栈的现有长度:" + stack.getSize(stack));
System.out.println("----测试入栈操作----");
for (int i = 1; i <= 6; i++) {
System.out.println("将test" + i + "压入栈");
stack.push(stack, "test" + i);
}
System.out.println("栈的现有长度:" + stack.getSize(stack));
System.out.println("----测试读取栈顶操作----");
stack.peek(stack);
System.out.println("----测试出栈操作----");
for (int i = 1; i <= 7; i++) {
System.out.println("栈的现有长度:" + stack.getSize(stack));
System.out.println(stack.pop(stack));
}
}
}
测试结果:
----新建空栈----
栈的现有长度:0
----测试入栈操作----
将test1压入栈
test1已读取
test1已入栈
将test2压入栈
test2已读取
test2已入栈
将test3压入栈
test3已读取
test3已入栈
将test4压入栈
test4已读取
test4已入栈
将test5压入栈
test5已读取
test5已入栈
将test6压入栈
test6已读取
test6已入栈
栈的现有长度:6
----测试读取栈顶操作----
test6已读取
----测试出栈操作----
栈的现有长度:6
test6
栈的现有长度:5
test5
栈的现有长度:4
test4
栈的现有长度:3
test3
栈的现有长度:2
test2
栈的现有长度:1
test1
栈的现有长度:0
栈已空,无法出栈
null