算法(第四版)——队列

继续复习......


定义

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。 

代码实现 

//可变长度的队列实现
public class ResizingArrayQueue<Item> implements Iterable<Item> {
	
	private Item[] a = (Item[]) new Object[1];  // 数组不能直接使用泛型
	private int head = 0;                       // 队列头索引
	private int tail = 0;                       // 队列尾索引
	private int N = 0;                          // 队列中元素的数目
	
	/**
	* 返回队列是否为空值。
	* @return true 队列为空,false 队列不为空。
	*/
	public boolean isEmpty() {
		return N == 0; 
	}
	
	/**
	* 返回队列中元素的数目。
	* @return 队列中元素的数目。
	*/
	public int size() {
		return N;
	}
	
	/**
	* 添加元素到队尾。
	* 如果队尾容量不足,调用resize()方法动态调整。
	* @param item 被添加的元素
	*/
	public void add(Item item) {
		//N增加至数组容量时,动态扩展为原来的2倍。
		if (N == a.length) 
			resize(a.length * 2);
		//从尾部添加元素
		a[tail++] = item;
		//N加一
		N++;
	}
	
	/**
	* 移除队列元素并返回被删除的元素。
	* 如果队列非空元素过少则减少空间。
	* @return Item 被删除的元素。
	*/
	public Item remove() {
		Item item = a[head];    // 从队列头移除元素
		a[head++] = null;       // 将队列头元素设为null避免对象游离
		N--;                    // N减一
		
		//如果索引增加到数组长度重新置0
		if (head == a.length)
			head = 0;
		
		// 如果队列非空元素过少则减少空间
		if (N <= a.length / 4)
			resize(a.length / 2)
		
		return item;
	}
	
	/*
	* 重置队列大小的方法
	* @param 重置队列的大小
	*/
	public void resize(int n) {
        //创建一个新数组。
        Item[] items=(Item[])new Object[n];
		//将老数组赋给新数组。
        for(int i=0;i<N;i++) {
            items[i]=a[(i+head)%a.length];   
        }
        a=items;
        //将头元素和尾部元素分别置位.
        head=0;    
        tail=N;
    }
	
	/**
	* 实现iterable的方法
	*/
	@Override
    public Iterator<Item> iterator() {
        return new QueueIterator();
    }
	
    class QueueIterator implements Iterator<Item> {
        int i=0;
		
        @Override
        public boolean hasNext() {
            return i<N;    
        }

        @Override
        public Item next() {
            Item item=a[(i+head)%a.length];    //从头元素开始获取元素.
            i++;
            return item;
        }
        
    }
}

ps:台风山竹真的有点吓人......

猜你喜欢

转载自blog.csdn.net/qq_41722272/article/details/82747793