算法学习(5):队列的特点以及实现

队列是一种逻辑数据结构,代表的是先进先出的区域.就好像一个两端都是空的管子,一端用来进,一端用来出.和我们日常排队是一样的,出的一端代表商户,你只有到商户那边才能买东西,先到的先买.
在这里插入图片描述

用链表自己简单实现一个队列

public class MyLinkQueue<E> {
    private Node<E> first;
    private Node<E> last;
    private Integer size = 0;

    public MyLinkQueue() {
    }

    public boolean add(E o) {
        Node<E> l = last;
        Node<E> objectNode = new Node<>(o, l, null);
        last = objectNode;
        if (l == null) {
            first = objectNode;
        } else {
            first.next = objectNode;
        }
        size++;
        return true;
    }

    public Object poll() {
        if (size == 0) {
            throw new EmptyStackException();
        }
        E val = last.val;
        Node previous = last.previous;
        previous.next = null;
        last = previous;
        size--;
        return val;
    }


    public Object peek() {
        if (size == 0) {
            throw new EmptyStackException();
        }
        return last.val;
    }

    public class Node<E> {
        E val;
        Node previous;
        Node next;

        Node () {
        }

        Node (E val) {
            this.val = val;
        }

        Node (E val, Node previous, Node next) {
            this.val = val;
            this.previous = previous;
            this.next = next;
        }
    }
}

两个链表的节点,分别代表头尾,然后在增删的时候维护好节点之间的关系就好了.

用数组自己简单实现一个队列

public class MyArrayQueue<E> {
    private Object[] array;
    private Integer addIndex;
    private Integer pollIndex;
    private Integer size;

    public MyArrayQueue(Integer size) {
        this.array = new Object[size];
        this.addIndex = 0;
        this.pollIndex = 0;
        this.size = 0;
    }

    public boolean add(E o) {
        //
        if (size == array.length)
            throw new ArrayIndexOutOfBoundsException();
        array[addIndex] = o;
        addIndex++;
        if (addIndex == array.length)
            addIndex = 0;
        size++;
        return true;
    }

    public Object poll() {
        if (size == 0) {
            throw new EmptyStackException();
        }
        Object o = array[pollIndex];
        pollIndex++;
        if (pollIndex == array.length)
            pollIndex = 0;
        size--;
        return o;
    }


    public Object peek() {
        if (size == 0) {
            throw new EmptyStackException();
        }
        return array[pollIndex];
    }
}

这里用一个固定长度的数组来实现队列,用两个指针分别代表数据进入时数组的索引和数据出去时数组的索引,为了防止维护两个指针之间的逻辑关系从而提高程序复杂度,所以加入size字段代表现在数组用了多少空间,只要size不为0,就能取数据,size不等于数组长度,就能塞数据.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值