现在的位置: 首页 > 综合 > 正文

JAVA 实现栈 (这次是用链表实现)

2017年09月15日 ⁄ 综合 ⁄ 共 2015字 ⁄ 字号 评论关闭
今天搞了一上午,终于用JAVA实现了栈,包括入栈、出栈、返回栈顶值、打印栈中的数据都实现了。现在感觉用JAVA实现数据结构是一件很美妙的事情。以前都是看c语言描述的数据结构教材。虽然理解了,但是实现起来一直无从下手(我的C很烂,哈哈)。最近突发奇想用JAVA写,果然得心应手。终于有点小进步了。

话不多说,下面贴出代码:

实现接口:
package com.guobing.stack;

@SuppressWarnings("hiding")
public interface Stack_Interface<Object> {

	public void initStack();       //这个方法貌似可以不要,后面再看看
	public void push(Object obj);  //向栈顶插入一个元素
	public boolean isEmpty();      //判断是否为空
	public Object peek();          //返回栈顶元素的值
	public Object pop();           //从栈中删除栈顶元素并返回
	public void clear();           //清除栈中的所有元素使之成为一个空栈
	public void print();           //打印栈中的元素
}

实现接口:

package com.guobing.stack;
/**
 * @topic 栈的链表实现
 * @author guobbing
 * @version 1.1
 * @since 12:33
 */
public class LinkedStack implements Stack_Interface{

	private Node top;                                       //定义栈顶指针
	
	/**
	 * 清除栈中的元素,使之成为空栈
	 */
	@Override
	public void clear() {                                   
		top = null;
	}

	/**
	 * 初始化栈
	 */
	@Override
	public void initStack() {
		top = null;
	}

	/**
	 * 判断栈是否为空 
	 */
	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return top == null;
	}

	/**
	 * 得到栈顶元素并返回
	 */
	@Override
	public Object peek() {                                  
		if(top == null) {
			System.out.println("栈为空");
			return null;
		}		
		System.out.println("当前栈顶元素的值为:" + top.element);
		return top.element;
	}

	/**
	 * 删除栈顶元素并返回
	 */
	@Override
	public Object pop() {                                  
		if(top == null) {
			System.out.println("空指针");
			return null;
		} else {
			Node p = top;                                       //定义一个p来保存栈顶指针
			System.out.println("删除了栈顶元素" + top.element);
			top = top.next;                                     //指向下一个,原来栈顶的引用丢失,等待被回收内存
			return p.element;
		}                                  //当栈顶元素为空时,返回空指针		
	}

	/**
	 * 打印栈中的元素
	 */
	@Override
	public void print() {
		Node p = top;
		while(p != null) {		
			System.out.println(p.element);
			p = p.next;
		}		
	}

	@Override
	public void push(Object obj) {
		top = new Node(obj, top);		
	}
	
	//测试
	public static void main(String [] args) {
		LinkedStack ls = new LinkedStack();
		ls.initStack();
		ls.push("a");
		ls.push("b");
		ls.push("c");
		ls.push("d");
		ls.push("e");
		ls.push("f");
		ls.peek();                                          //得到栈顶元素
		System.out.println("当前栈中元素为:");
		ls.print();                                         //打印栈中的元素
		System.out.println("删除栈顶元素后:");
		if(!ls.isEmpty()) {
			ls.pop();                                       //删除栈顶元素
			ls.peek();
			ls.print();
		}		
		System.out.println("清空栈之后:");
		ls.clear();                                         //清空栈
		ls.peek();
	}
}

/**
 * 定义每个链表块
 * @author guob
 *
 */
class Node {
	Object element;
	Node next;
	public Node(Node nt) {                   //两种构造方法
		next = nt;
	}
	public Node(Object obj, Node nt) {       //相当于在头结点处插入数据
		element = obj;
		next = nt;
	}
}

测试结果:

当前栈顶元素的值为:f
当前栈中元素为:
f
e
d
c
b
a
删除栈顶元素后:
删除了栈顶元素f
当前栈顶元素的值为:e
e
d
c
b
a
清空栈之后:
栈为空

抱歉!评论已关闭.