栈的简单实现(三)

继上文栈的简单实现(一)栈的简单实现(二)实现了顺序结构的栈后,本文为简单实现链式栈结构。

代码如下:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值