欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-05 14:49:28
...

链式栈示意图

链式栈--------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指针为空,此时在进行出栈时,便会产生空指针异常问题。