一、Java数据结构实现之队列

0. 形象记忆:

一年月初就是过年季节,而第一个数据结构选择是队列,过年季节,你就要春运买票,虽然现在可以网络买票,但是以前我们可都是去火车站排队买票的,排队买票就是先进先出的

队列:特点,先进先出,比较基础的数据结构
概念:只允许在一端插入数据操作,在另一端进行删除数据操作的特殊线性表;进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列);队列具有先进先出(FIFO)的特性

1. 代码思路

1.1、构造方法
    //第一位
    private Node<Item> first;
    //最后一位
    private Node<Item> last;
    // 统计队列总数
    private int n;

    public Queue() {
        first = null;
        last  = null;
        n = 0;
    }
1.2、入队
  public void enqueue(Item item) {
        Node<Item> oldlast = last;
        last = new Node<Item>();
        last.item = item;
        last.next = null;
        if (isEmpty()) first = last;
        else           oldlast.next = last;
        n++;
    }
  • 先把last保存,然后生成一个数据结构作为新的最后一位,他的下一位是未知,所以是空的,
  • 判断如果队列是空的(第一位是空)那新的最后一位同时也是第一位,不然老的最后一位下一位就是新的最后的一位
  • 统计数+1
1.3、出队
    public Item dequeue() {
        if (isEmpty()) throw new NoSuchElementException("Queue underflow");
        Item item = first.item;
        first = first.next;
        n--;
        if (isEmpty()) last = null;   // to avoid loitering
        return item;
    }
  • 判断是否为空,直接抛错
  • 第一位出对,取出第一位的下一位设置为第一位
  • 统计数-1
  • 判断是否为空,如果为空最后一位也是空,
  • 返回item

3. 全部代码



public class Queue<Item> implements Iterable<Item> {
    private Node<Item> first;
    private Node<Item> last;
    private int n;


    private static class Node<Item> {
        private Item item;
        private Node<Item> next;
    }

    /**
     * 初始化一个空队列.
     */
    public Queue() {
        first = null;
        last  = null;
        n = 0;
    }


    /**
     * 是否为空
     * @return
     */
    public boolean isEmpty() {
        return first == null;
    }

    /**
     * 返回队列数目
     * @return
     */
    public int size() {
        return n;
    }

    /**
     * 返回队列First,但是不溢出
     * @return
     */
    public Item peek() {
        if (isEmpty()) throw new NoSuchElementException("Queue underflow");
        return first.item;
    }

    /**
     * 入队
     * @param item
     */
    public void enqueue(Item item) {
        Node<Item> oldlast = last;
        last = new Node<Item>();
        last.item = item;
        last.next = null;
        if (isEmpty()) first = last;
        else           oldlast.next = last;
        n++;
    }

    /**
     * 出列
     * @return
     */
    public Item dequeue() {
        if (isEmpty()) throw new NoSuchElementException("Queue underflow");
        Item item = first.item;
        first = first.next;
        n--;
        if (isEmpty()) last = null;   // to avoid loitering
        return item;
    }

    public String toString() {
        StringBuilder s = new StringBuilder();
        for (Item item : this) {
            s.append(item);
            s.append(' ');
        }
        return s.toString();
    } 

    public Iterator<Item> iterator()  {
        return new ListIterator<Item>(first);  
    }

    private class ListIterator<Item> implements Iterator<Item> {
        private Node<Item> current;

        public ListIterator(Node<Item> first) {
            current = first;
        }

        public boolean hasNext()  { return current != null;                     }
        public void remove()      { throw new UnsupportedOperationException();  }

        public Item next() {
            if (!hasNext()) throw new NoSuchElementException();
            Item item = current.item;
            current = current.next; 
            return item;
        }
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值