堆栈的动态链表实现

package stack;

/**
 * @author Eightn0
 * @create 2021-03-15 15:00
 * 用动态链表实现堆栈
 */

/*声明节点*/
class Node{
    int data;
    Node next;

    public Node(int data) {
        this.data = data;
        this.next = null;
    }
}

/*用链表实现堆栈并设计压栈、出栈、判断栈是否为空的方法*/
class StackByLink{
    public Node front;//指向栈底端的指针
    public Node rear;//指向栈顶端的指针

    /*判断栈是否为空:isEmpty()*/
    public boolean isEmpty(){
        return front == null;//通过底端指针是否为空判断栈是否为空
    }

    /*打印堆栈内容:output_of_stack*/
    public void output_of_stack(){
        Node current = front;//从底端指针开始
        while (current != null){//跳出循环的条件:打印完了
            System.out.println("["+current.data+"]");
            current=current.next;//指针下移,打印下一个
        }
        System.out.println();//出于美观
    }

    /*入栈——在顶端添加数据:insert*/
    public void insert(int data){
        Node newNode = new Node(data);//将要加入的数据装进节点
        if (this.isEmpty()){//当前栈为空的话,那么顶端、底端指针都在新节点上
            front = newNode;
            rear = newNode;
        }else {//当前栈非空,那么从顶端加入节点,让原来的顶端指向新节点,然后让顶端指针移动到新节点
            rear.next = newNode;
            rear = newNode;
        }
    }

    /*出栈——在顶端删除数据:pop*/
    public void pop(){
        Node newNode;
        if (isEmpty()){//空栈不需要删数据
            System.out.println("目前为空栈");
            return;
        }
        newNode = front;//栈里只有一个数据
        if (newNode == rear){
                front = null;
                rear = null;
                System.out.println("目前为空栈");//删了就空了
        }else {//比较一般的情形
            while (newNode.next != rear){
                newNode = newNode.next;
            }
            newNode.next = rear.next;
            rear = newNode;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/vivian233/article/details/114836280