数据结构_链栈的java实现

栈的特点

  • 栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线形表。
    栈是一种数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
  • 栈是只能在某一端插入和删除的特殊线性表。用桶堆积物品,先堆进来的压在底下,随后一件一件往堆。取走时,只能从上面一件一件取。堆和取都在顶部进行,底部一般是不动的。
  • 栈就是一种类似桶堆积物品的数据结构,进行删除和插入的一端称栈顶,另一堆称栈底。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO表)。

链栈的特点

  1. 物理结构不连续和逻辑结构连续

链栈的java实现

package stack;
/**
 * ================================数据结构说明:========================================
 * 
 * 名称:链栈
 * 
 * 特征:
 *      1. 物理结构不连续和逻辑结构连续
 * 
 * 主要方法:
 *      1. init:初始化顺序表
 *      2. destroy:销毁栈
 *      3. clear:清空栈中的元素
 *      4. length:获取数据表长度
 *      5. getTop: 获取栈顶元素
 *      6. pop: 退栈操作
 *      7. isEmpty:判断顺序栈是否为空
 *      8. print:打印顺序栈中的元素
 * 
 * ======================================================================================
 */
/**
 * @author 叶清逸
 * @date 2018年7月31日下午12:40:35
 * @version 1.0
 * @project stack
 */
public class LinkStack implements Stack {


    //头指针
    private SLElement top ;
    //长度
    private int LENGTH ;

    /**
     * @see stack.Stack#init()
     * @explain init方法: 初始化
     * @throws 
     * @author 叶清逸
     * @date 2018年7月31日 下午2:30:31
     */
    @Override
    public void init() {

        /*初始化头结点*/
        top = new SLElement() ;
        top.setData(null);
        top.setNext(null);

        /*初始化长度*/
        LENGTH = 0 ;
    }

    /**
     * @see stack.Stack#destroy()
     * @explain destroy方法: 销毁栈
     * @throws 
     * @author 叶清逸
     * @date 2018年7月31日 下午2:42:24
     */
    @Override
    public void destroy() {
        /*若栈未初始化打印错误信息*/
        if(top == null){
            System.out.println("错误!栈未初始化");
            return ;
        }
        top = null ;
        LENGTH = 0 ;
    }
    /**
     * @see stack.Stack#clear()
     * @explain clear方法: 清空栈
     * @throws 
     * @author 叶清逸
     * @date 2018年7月31日 下午2:43:00
     */
    @Override
    public void clear() {
        /*若栈未初始化打印错误信息*/
        if(top == null){
            System.out.println("错误!栈未初始化");
            return ;
        }
        top.setNext(null);
    }
    /**
     * @see stack.Stack#isEmpty()
     * @explain isEmpty方法:判断栈是否为空,若为空返回true否则返回false
     * @return 栈的长度
     * @throws 
     * @author 叶清逸
     * @date 2018年7月31日 下午2:49:38
     */
    @Override
    public boolean isEmpty() {

        if(LENGTH == 0)
            return true ;
        else
            return false;
    }

    /**
     * @see stack.Stack#length()
     * @explain length方法: 获取栈的大小
     * @return 栈的大小
     * @throws 
     * @author 叶清逸
     * @date 2018年7月31日 下午2:50:41
     */
    @Override
    public int length() {
        /*若栈未初始化打印错误信息*/
        if(top == null){
            System.out.println("错误!栈未初始化");
            return -1;
        }
        return LENGTH ;
    }

    /**
     * @see stack.Stack#getTop()
     * @explain getTop方法:
     * @return Object 返回栈顶元素
     * @throws 
     * @author 叶清逸
     * @date 2018年7月31日 下午2:52:53
     */
    @Override
    public Object getTop() {
        /*若栈未初始化打印错误信息*/
        if(top == null){
            System.out.println("错误!栈未初始化");
            return null ;
        }
        /*若不为头结点则返回数据,否则返回null*/
        return top.getData() ;
    }
    /**
     * @see stack.Stack#push(java.lang.Object)
     * @explain push方法: 压栈操作
     * @param elem 要压入的元素
     * @throws 
     * @author 叶清逸
     * @date 2018年7月31日 下午2:53:37
     */
    @Override
    public void push(Object elem) {
        /*若栈未初始化打印错误信息*/
        if(top == null){
            System.out.println("错误!栈未初始化");
            return ;
        }
        /*压入元素*/
        SLElement e = new SLElement(elem,top) ;
        /*修改栈顶指针*/
        top = e ;
        /*长度+1*/
        LENGTH++ ;
    }

    /**
     * @see stack.Stack#pop()
     * @explain pop方法: 退栈操作
     * @return 已退栈的元素
     * @throws 
     * @author 叶清逸
     * @date 2018年7月31日 下午2:56:44
     */
    @Override
    public Object pop() {
        /*若栈未初始化打印错误信息*/
        if(top == null){
            System.out.println("错误!栈未初始化");
            return null;
        }
        /*保存栈顶元素*/
        SLElement elem = top ;
        /*修改栈顶指针*/
        top = top.getNext() ;
        /*长度-1*/
        LENGTH-- ;
        return elem.getData() ;
    }

    /**
     * @see stack.Stack#print()
     * @explain print方法: 打印栈(从栈顶到栈底)
     * @throws 
     * @author 叶清逸
     * @date 2018年7月31日 下午2:59:54
     */
    @Override
    public void print() {
        /*若栈未初始化打印错误信息*/
        if(top == null){
            System.out.println("错误!栈未初始化");
            return ;
        }
        /*初始化遍历指针*/
        SLElement p = top ;
        /*循环访问每个节点*/
        while(p.getNext() != null){
            System.out.print(p.getData() + " ");

            p = p.getNext() ;
        }

        System.out.println();
    }

}

/*节点类型*/
class SLElement implements Element{

    private Object data ;
    private SLElement next ;

    public SLElement() {
        super();
    }
    public SLElement(Object data, SLElement next) {
        super();
        this.data = data;
        this.next = next;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }
    public SLElement getNext() {
        return next;
    }
    public void setNext(SLElement next) {
        this.next = next;
    }

}

猜你喜欢

转载自blog.csdn.net/u013634252/article/details/81304067