普林斯顿公开课 算法2-9:队列

接口


队列的接口和栈的接口是类似的


  • enqueue();

  • dequeue();

  • isEmpty();


链表方式实现


队列需要两个指针,记录头和尾。出队时与栈是一样的,入队的时候在结尾增加一个节点。


代码

public class LinkedQueue<T> {
    private class Node {
        public T value;
        public Node next;
    }
 
    private Node first;
    private Node last;
 
    public LinkedQueue(){
    }
 
    public void enqueue(T value){
        Node node = new Node();
        node.value = value;
        node.next = null;
 
        if(isEmpty()){ // 处理队列为空的特殊情况
            first = node; // 注意第一个节点
            last = node;
        else {
            last.next = node;
            last = node;
        }
    }
 
    public T dequeue(){
        T result = first.value;
        first = first.next;
 
        if(isEmpty()){ // 处理队列为空的特殊情况
            last = null;
        }
 
        return result;
    }
 
    public boolean isEmpty(){
        return first == null;
    }
}


数组方式实现


队列也可以使用数组方式实现,当数组的使用率小于25%时,就重新调整数组的大小


代码


public class ArrayQueue<T> {
    private Object[] s;
    private int head;
    private int tail;
 
    public ArrayQueue(){
        s = new Object[2];
    }
 
    public void enqueue(T item){
        // 如果数组已满,调整数组
        if(s.length == tail){
            resize(s.length*2);
        }
 
        // 添加到数组的末尾
        s[tail] = item;
        tail++;
    }
 
    public T dequeue() {
        // 返回的结果应该是队列的头部
        Object result = s[head];
        head++;
 
        // 如果队列使用率不到1/4,则调整数组大小
        int size = this.size();
        if(size >= 2 && size < s.length/4){
            resize(s.length/2);
        }
 
        // 返回结果
        return (T)result;
    }
 
    private void resize(int size){
        //复制一份新的数组
        Object[] copy = new Object[size];
        int queueSize = this.size();
        for(int i=0;i<queueSize;i++){
            copy[i] = s[i+head];
        }
        s = copy;
 
        // 重置指针
        head=0;
        tail=queueSize;
    }
 
    // 队列长度
    private int size() {
        return tail-head;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值