链式栈--------Java实现

链式栈示意图

这里写图片描述

Java代码实现

/**
 * @author mwl
 * @date 2018年4月27日  
 * @version 1.0.0 
 */
public class LinkStack {

    /**
     * 定义链栈的结点
     * Object类型的数据域
     * Node类型的指针域
     * @author MWL
     */
    private class Node{
        Object data;
        Node next;

        public Node(){}

        public Node(Object data,Node next){
            this.data = data;
            this.next = next;
        }
    }

    private Node top;   //栈顶元素
    private int size;   //当前栈的大小

    /**
     * 创建空链栈
     */
    public LinkStack() {
        top = null;
    }

    /**
     * 以data数据元素创建链式栈
     * @param data
     */
    public LinkStack(Object data){
        top = new Node(data,null);
        size++;
    }

    /**
     * 判断链栈是否为空栈
     * @return
     */
    public boolean isEmpty(){
        return size == 0 ? true : false;
    }

    /**
     * 返回链栈的长度
     * @return
     */
    public int length(){
        return size;
    }

    /**
     * 压栈(入栈)
     * @param data
     */
    public void push(Object data){

        //更新头节点
//      System.out.print("压栈成功:" + data + "指向->" + top + "\t");
        // 让top指向新创建的元素,新元素的next引用指向原来的栈顶元素
        top = new Node(data, top);
        size++;

    }

    /**
     * 出栈
     * @return
     */
    public Object pop(){

        if(isEmpty()) {
            System.out.println("目前是空栈,无法进行出栈!");
            return "error!";
        }
        Node temp = top;    
        // 更新头结点
        top = top.next;
        // 释放原栈顶元素的next引用,删除指针指向
        temp.next = null;
        size--;
        return temp.data;
    }

    /**
     * 访问栈顶元素
     * @return
     */
    public Object peek(){
        if(top != null){
            return top.data;
        }
        return "空栈,无栈顶元素!";
    }

    /**
     * 遍历栈并打印栈内元素
     */
    public void displayStack(){
        while(top != null){
            System.out.println(top.data + "\t");
            top=top.next;
        }
    }
    /**
     * 清空栈
     */
    public void clear(){
        top = null;
        size = 0;
    }

    public static void main(String[] args) {

        LinkStack stack = new LinkStack("how");
        stack.push(3);
        stack.push("hello");
        stack.push('A');
//      stack.displayStack();
        System.out.println("++++++++++++");
        System.out.println("当前栈的长度为:" + stack.length());
        System.out.println("当前栈是否为空:" + stack.isEmpty());
        System.out.println("当前栈的栈顶元素为:" + stack.peek());
        System.out.println("第一次出栈时的栈顶元素:" + stack.pop());
        System.out.println("============");
        System.out.println("出栈后的栈顶元素:" + stack.peek());
        System.out.println("第二次出栈时的栈顶元素:" + stack.pop());
        System.out.println("第三次出栈时的栈顶元素:" + stack.pop());
        System.out.println("第四次出栈时的栈顶元素:" + stack.pop());
        System.out.println("************");
    }
}

程序运行结果如下:
++++++++++++
当前栈的长度为:4
当前栈是否为空:false
当前栈的栈顶元素为:A
第一次出栈时的栈顶元素:A
============
出栈后的栈顶元素:hello
第二次出栈时的栈顶元素:hello
第三次出栈时的栈顶元素:3
第四次出栈时的栈顶元素:how
************

注意:在以上代码中,如果在出栈前就已经对链栈中的栈内元素进行打印输出,那么在执行出栈操作的时候会产生空指针异常,因为在进行打印镇内元素时,栈顶指针发生了变化,整个栈内元素打印完毕,top指针为空,此时在进行出栈时,便会产生空指针异常问题。

猜你喜欢

转载自blog.csdn.net/wilson_m/article/details/80104424