【Java数据结构】栈、队列、链表

看B站的数据结构视频照着打的,留着自己复习方便看。
B站链接:Java数据结构
【Java数据结构】栈、队列、链表_第1张图片
栈:栈的底层我们使用数组来存储数据

package demo2;

public class MyStack {
    //栈的底层我们使用数组来存储数据
    int[] elements;

    public MyStack(){
        elements = new int[0];
    }

    //压入元素
    public void push(int element){
        //创建一个新的数组
        int[] newArr = new int[elements.length + 1];
        for (int i = 0; i < elements.length; i++) {
            newArr[i] = elements[i];
        }
        //把添加的元素放入新数组中
        newArr[elements.length] = element;
        //使用新数组替换旧数组
        elements = newArr;
    }

    //取出栈顶元素
    public int pop(){
        //栈中没有元素
        if (elements.length == 0){
            throw new RuntimeException("stack is empty");
        }
        //取出数组的最后一个元素
        int element = elements[elements.length-1];
        //创建一个新的数组
        int[] newArr = new int[elements.length-1];
        //原数组中除了最后一个元素的其他元素都放入新的数组中
        for (int i=0;i<elements.length-1;i++){
            newArr[i] = elements[i];
        }
        //替换数组
        elements = newArr;
        //返回数组
        return element;
    }

    //查看栈顶元素
    public int peek(){
        return elements[elements.length-1];
    }
}

测试栈:

package demo2.demo2.test;

import demo2.MyStack;

public class testMyStack {
    public static void main(String[] args){
        //创建一个栈
        MyStack ma = new MyStack();
        //压入数据
        ma.push(9);
        ma.push(8);
        ma.push(7);
        //输出栈顶元素
        System.out.println(ma.pop());
        //查看栈顶元素
        System.out.println(ma.peek());
    }
}

队列:

package demo2;

public class MyQueue {
    int[] elements;

    public MyQueue(){
        elements = new int[0];
    }

    //入队
    public void add(int element){
        //创建一个新的数组
        int[] newArr = new int[elements.length + 1];
        for (int i = 0; i < elements.length; i++) {
            newArr[i] = elements[i];
        }
        //把添加的元素放入新数组中
        newArr[elements.length] = element;
        //使用新数组替换旧数组
        elements = newArr;
    }

    public int poll(){
        //把数组中第0个元素取出来
        int element = elements[0];
        //创建新的数组
        int[] newArr = new int[elements.length-1];
        for (int i=0;i<newArr.length;i++){
            newArr[i] = elements[i+1];
        }
        //替换数组
        elements = newArr;
        return element;
    }

    //判断队列是否为空
    public boolean isEmpty(){
        return elements.length == 0;
    }
}

测试队列:

package demo2.demo2.test;

import demo2.MyQueue;

public class testMyQueue {
    public static void main(String[] args){
        //创建一个队列
        MyQueue mq = new MyQueue();
        //入队
        mq.add(9);
        mq.add(8);
        mq.add(7);
        //出队
        System.out.println(mq.poll());
        System.out.println(mq.poll());
        System.out.println(mq.isEmpty());
    }
}

链表:节点

package demo2;

//一个节点
public class Node {
    //节点内容
    int data;
    //下一个节点
    Node next;

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

    //为节点追回节点
    public Node append(Node node){
        //当前节点
        Node currentNode = this;
        //循环向后找
        while (true){
            //取出下一个节点
            Node nextNode = currentNode.next;
            //如果下一个节点为null,当前节点已经是最后一个节点
            if (nextNode==null){
                break;
            }
            //赋给当前节点
            currentNode = nextNode;
        }
        //把需要追回的节点追加为找到的当前节点的下一个节点
        currentNode.next = node;
        return this;
    }

    //插入节点作为当前节点的下一个节点
    public void after(Node node){
        //取出下一个节点作为下下一个节点
        Node nextNext = this.next;
        //把新节点作为当前节点的下一个节点
        this.next = node;
        //把下下节点设置为新节点的下一个节点
        node.next = nextNext;
    }

    //显示所有节点信息
    public void show(){
        Node currentNode = this;
        while (true){
            System.out.print(currentNode.data+" ");
            //取出下一个节点
            currentNode = currentNode.next;
            //如果是最后一个节点
            if (currentNode == null){
                break;
            }
        }
        System.out.println();
    }

    //删除下一个节点
    public void remove(){
        //取出下下一个节点
        Node newnext = this.next.next;
        //把下下一个节点设置为当前节点的下一个节点
        this.next = newnext;
    }

    //获取下一个节点
    public Node next(){
        return this.next;
    }

    //获取节点中的数据
    public int getData(){
        return this.data;
    }

    //当前节点是否是最后一个节点
    public boolean islast(){
        return next==null;
    }
}

测试节点:

package demo2.demo2.test;

import demo2.Node;

public class testNode {
    public static void main(String[] agrs){
        //创建节点
        Node n1 = new Node(1);
        Node n2 = new Node(2);
        Node n3 = new Node(3);
        //追加节点
//        n1.append(n2);
//        n1.append(n3);
        n1.append(n2).append(n3).append(new Node(4));
        //取出下一个节点的数据
//        System.out.println(n1.next().next().next().getData());
        //判断节点是否为最后一个节点
//        System.out.println(n1.next().islast());
//        System.out.println(n1.next().next().next().islast());

        //显示所有节点信息
        n1.show();
//        n1.next().remove();
//        n1.show();
        //插入一个新的节点
        Node node = new Node(5);
        n2.after(node);
        n1.show();
    }
}

循环链表:

package demo2;

//一个节点
public class LoopNode {
    //节点内容
    int data;
    //下一个节点
    LoopNode next=this;

    public LoopNode(int data){
        this.data=data;
    }


    //插入节点作为当前节点的下一个节点
    public void after(LoopNode node){
        //取出下一个节点作为下下一个节点
        LoopNode nextNext = this.next;
        //把新节点作为当前节点的下一个节点
        this.next = node;
        //把下下节点设置为新节点的下一个节点
        node.next = nextNext;
    }

    //删除下一个节点
    public void remove(){
        //取出下下一个节点
        LoopNode newnext = this.next.next;
        //把下下一个节点设置为当前节点的下一个节点
        this.next = newnext;
    }

    //获取下一个节点
    public LoopNode next(){
        return this.next;
    }

    //获取节点中的数据
    public int getData(){
        return this.data;
    }
}

测试循环链表:

package demo2.demo2.test;

import demo2.LoopNode;

public class testLoopNode {
    public static void main(String[] args){
        LoopNode n1 = new LoopNode(1);
        LoopNode n2 = new LoopNode(2);
        LoopNode n3 = new LoopNode(3);
        LoopNode n4 = new LoopNode(4);
        //增加节点
        n1.after(n2);
        n2.after(n3);
        n3.after(n4);
        System.out.println(n1.next().getData());
        System.out.println(n2.next().getData());
        System.out.println(n3.next().getData());
        System.out.println(n4.next().getData());
    }
}

双向链表:

package demo2;

public class DoubleNode {
    //上一个节点
    DoubleNode pre=this;
    //下一个节点
    DoubleNode next=this;
    //节点数据
    int data;

    public DoubleNode(int data){
        this.data = data;
    }

    //增加节点
    public void after(DoubleNode node){
        //原来的下一个节点
        DoubleNode nextNext = this.next;
        //把新节点作为当前节点的下一个节点
        this.next = node;
        //把当前节点做新节点的前一个节点
        node.pre = this;
        //让原来的下一个节点作为新节点的下一个节点
        node.next = nextNext;
        //让原来的下一个节点的上一个节点为新节点
        nextNext.pre = node;
    }

    //下一个节点
    public DoubleNode next(){
        return this.next;
    }

    //上一个节点
    public DoubleNode pre(){
        return this.pre;
    }

    //获取数据
    public int getData(){
        return this.data;
    }
}

测试循环链表:

package demo2.demo2.test;

import demo2.DoubleNode;

public class testDoubleNode {
    public static void main(String[] args){
        //创建节点
        DoubleNode n1 = new DoubleNode(1);
        DoubleNode n2 = new DoubleNode(2);
        DoubleNode n3 = new DoubleNode(3);
        //追加节点
        n1.after(n2);
        n2.after(n3);
        System.out.println(n2.pre().getData());
        System.out.println(n2.getData());
        System.out.println(n2.next().getData());
        System.out.println(n3.next().getData());
        System.out.println(n1.pre().getData());
    }
}

你可能感兴趣的:(数据结构,数据结构,java,链表,队列)