美文网首页
Java知识总结-实现队列的两种方式

Java知识总结-实现队列的两种方式

作者: 代码足迹 | 来源:发表于2018-04-27 14:50 被阅读0次

网上看了好多实现队列的实现方式,做个个人总结。队列的主要特征就是 先进先出。实现队列基本上有两种思路实现:
1.使用数组(弊端是数据有大小限制,会出现队列已满的情况)
2.通过链表
下面分别来讲一下这两种 方式

1.使用数组的方式

使用数据的方式可以理解为一个队列是一个圆形的数组,分别用两个参数记录队头(front)和队尾(rear)的位置。

20130806120215890.jpg

如果只是用头和尾来标识的话还不能满足要求,因为刚头和尾相同时,还要区分是空的还是满的情况,所以需要加一个参数记录当前队列个数。

简单的实现代码如下


public class MyQueue<T> {

    private Object[] array;
    private int size;
    private int front;
    private int rear;
    private int counter;

    public MyQueue(int size) {
        array = new Object[size];
        this.size = size;
        this.front = 0;
        this.rear = 0;
        this.counter = 0;
    }


    public boolean isFull() {
        return this.counter >= this.size;
    }

    public boolean isEmpty() {
        return this.counter <= 0;
    }

    /**把数据放入队列*/
    public boolean push(Object data) {
        if(isFull()) return false;

        array[this.rear] = data;
        this.rear = (this.rear + 1) % this.size;

        this.counter ++;
        return true;
    }

    /**删除队列最前面的数*/
    public boolean delete() {
        if(isEmpty()) return false;

        this.front = (this.front+1) % this.size;
        this.counter --;

        return true;
    }

    /**出出队并删除数据*/
    public T getData(){
        if(isEmpty()) return null;
        return (T) array[this.front];
    }

    /**出出队并删除数据*/
    public T pull() {
        T data = getData();
        delete();
        return data;
    }

}

测试代码

MyQueue1<Integer> queue = new MyQueue1<Integer>(5);

        for (int i = 0; i < 20; i++) {
            boolean f = queue.push(i);
            System.out.println(i + " = " +f);
            if(i % 3 == 0) {
                System.out.println("输出:"+queue.pull());
            }
        }

        int ind = 0;
        while (ind < 30) {
            ind ++;
            System.out.println("  输出:"+queue.pull());
        }

好了,下面再来介绍通过链表的方式。

2 链表的实现方法

先看下图


队列.jpg

链表的方式的思路就是在每个节点存数据的同时记录下一个节点的信息

Node代码


public class Node {
    private Object val;
    private Node next;

    public Node(){}
    public Node(Object value) {
        val = value;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public Object getValue() {
        return val;
    }

    public Node getNext() {
        return next;
    }
}

队列代码


public class MyQueue {
    private Node front = new Node();
    private Node rear = front;

    public boolean isEmpty() {
        return front == rear;
    }

    /**向队列中放入数据*/
    public boolean push(Object o) {
        Node node = new Node(o);

        this.rear.setNext(node);
        this.rear = node;

        return true;
    }

    /**从队列中读取数据*/
    public Object pull() {
        if(isEmpty()) return  null;

        Node deNode = front.getNext();
        Object val = deNode.getValue();

        //判断是否最后一个节点
        if(deNode.getNext() == null) {
            front = rear;
        } else {
            front.setNext(deNode.getNext());
        }

        return val;
    }
}

相关文章

  • Java知识总结-实现队列的两种方式

    网上看了好多实现队列的实现方式,做个个人总结。队列的主要特征就是 先进先出。实现队列基本上有两种思路实现:1.使用...

  • JUC--并发容器:ConcurrentLinkedQueue

    2018-10-02 原文推荐 死磕Java并发 要实现一个线程安全的队列有两种方式:阻塞和非阻塞。阻塞队列无非就...

  • java知识总结-JKD中的队列

    上篇写总结了自己实现队列的方式,但其实Java本身就已经实现了。 以上是JDK里面的类继承关系。下面看看Queue...

  • 队列

    基于数组的循环队列 Java实现 基于链表的队列实现 Java实现

  • 线程通信-wait(notify)

    知识总结 多线程通信最经典的模型就是生产者消费者模式,java中有队列LinkedList可以实现该模式,做到通信...

  • Java数据结构和算法系列———队列

    目录 1、队列的基本概念 2、Java模拟单向队列实现 3、双端队列 4、优先级队列 5、总结 1、队列的基本概念...

  • 集合知识点整理

    1.前言:数据结构——队列 队列接口先说明有哪些功能,但不说是如何实现的,队列有两种实现方式: 循环数组 链表 循...

  • java并发容器-ConcurrentLinkedQueue

    java 提供的线程安全queue队列分两种,一种是阻塞队列,类似实现BlockingQueue接口的类,使用加锁...

  • iOS多线程---GCD方法/实现Timer

    多线程核心概念: 一个任务 / 两种队列 / 两种函数. 多线程创建队列的两种方式 GCD实现的Timer如图所示...

  • Java数组实现循环队列

    Java数组实现循环队列 上一节(Java实现队列——顺序队列、链式队列)我们使用数组实现了顺序队列,但是在tai...

网友评论

      本文标题:Java知识总结-实现队列的两种方式

      本文链接:https://www.haomeiwen.com/subject/afdgmttx.html