栈与队列链表版【Java算法(四)】

目录

1.栈

 2.队列

3.测试


项目结构:

 array包下的类,属于上一章的内容。点击链接了解详情

1.栈

Stack.java

/*
    链表版的栈
 */

public class Stack {

    //节点
    private class Node{
        int data;//存放数据
        Node next;//存放下一节点位置

        //创建节点时,需要用到
        Node(int data){
            this.data = data;
        }
    }

    private int top;//栈顶
    private Node head;//头节点
    private Node tail;//尾结点

    /**
     * 入栈
     * @param data 放入的数据(也可以是元素)
     */
    public void push(int data){

        Node pushedData = new Node(data);//创建一个要入栈的节点

        //如果此时是空栈
        if(top == 0){
            //将该元素作为头节点,尾结点
            head = pushedData;
            tail = pushedData;
        }else{
            //非空栈
            tail.next = pushedData;
            tail = pushedData;
        }
        top++;//入栈,栈顶加1
    }

    /**
     * 出栈
     * @return 返回一个出栈的元素
     */
    public int pop() throws Exception{

        Node node = head;
        int data;//弹出的数据

        //判断栈是否为空
        if(top <= 0){
            throw new Exception("栈为空,无法出栈!");
        }

        //当前只有1个元素在栈中
        if(top == 1){
            data = node.data;
            top--;//出栈减一
            return data;
        }

        //找到倒数第二个元素,将它设置成尾结点!
        Node node1 = get(top - 2);
        data = node1.next.data;//就是尾结点的数据
        top--;//出栈,栈顶减一
        return data;
    }

    /**
     * 获取index位置的节点
     * @param index 元素的位置
     * @return 返回index位置的节点
     */
    private Node get(int index){

        Node node = head;

        for(int i = 0;i < index;i++){
            //当最后一次循环时,i = index - 1(index - 1时的节点的下一个节点,即我们要的节点)
            node = node.next;
        }

        return node;
    }

    public String toString(){

        Node node = head;//从头节点开始遍历
        String str = "[";

        for(int i = 0;i < top;i++){
            str += node.data;
            node = node.next;
            if(i != top - 1){
                str += ",";
            }
        }

        str += "]";
        return str;
    }
}

 2.队列

Queue.java

/*
    队列:链表版
 */

public class Queue {

    //节点
    private class Node{
        int data;//存放数据
        Node next;//存放下一节点位置

        //创建节点时,需要用到
        Node(int data){
            this.data = data;
        }
    }

    private Node head;//头节点
    private Node tail;//尾结点
    private int font;//队头
    private int rear;//队尾

    /**
     * 入队[队尾进行插入]
     * @param element 入队的元素
     */
    public void enQueue(int element){

        Node insertedNode = new Node(element);//创建一个要插入队列的节点

        //判断是否是空队列
        if(font == rear){
            //头节点、尾结点都是它 ==> 通过这一点,我们也可以知道这是只有1个节点
            head = insertedNode;
        }else{
            //队列非空
            tail.next = insertedNode;
        }
        tail = insertedNode;//这种方式也行,不管非空与否,都要将插入节点设置为尾结点
        rear++;//插入元素后,队尾加1
    }

    /**
     * 出队[元素从队头出去]
     * @return 返回出队的数据
     */
    public int outQueue() throws Exception{

        if(font == rear){
            //队列空,无法出队
            throw new Exception("队列为空,无法出队!");
        }

        Node node = head;//在此处,头节点 == 队头
        Node nextHeadNode = node.next;//头节点的下一个节点
        int data;//返回出队的数据

        data = node.data;//将队头的数据赋值给data
        head = nextHeadNode;//将新的队头 ===> "原先队头"的下一个节点

        font++;

        return data;
    }

    /**
     * 获取index位置的节点
     * @param index 元素的位置
     * @return 返回index位置的节点
     */
    private Node get(int index){

        Node node = head;

        for(int i = 0;i < index;i++){
            //当最后一次循环时,i = index - 1(index - 1时的节点的下一个节点,即我们要的节点)
            node = node.next;
        }

        return node;
    }

    public String toString(){

        Node node = head;//从头节点开始遍历
        String str = "[";

        for(int i = font;i < rear;i++){
            str += node.data;
            node = node.next;
            if(i != rear - 1){
                str += ",";
            }
        }

        str += "]";
        return str;
    }
}

3.测试

TestLinkedlist.java

/*
    测试链表
 */

public class TestLinkedlist {

    public static void main(String[] args) {

        Queue queue = new Queue();

        System.out.println("入队:");
        queue.enQueue(1);
        queue.enQueue(2);
        queue.enQueue(3);
        queue.enQueue(4);
        queue.enQueue(5);
        queue.enQueue(6);

        System.out.println(queue);

        System.out.println("出队:");

        try {
            queue.outQueue();
            queue.outQueue();
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println(queue);
    }
}

最后,上述代码的视频在这里:点击链接,观看视频​​​​​​​ 

posted @ 2022-03-31 20:41  辰梦starDream  阅读(0)  评论(0编辑  收藏  举报  来源