数据结构与算法(四)队列

简介

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

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

 

Java模拟实现简单的队列

public class HeapArrays<T> {
	
	//数组存储数据
	private T[] data;
	//队列的大小,默认10
	private int maxSize = 10;
	//队列的头指针
	private int topPointer = 0;
	//队列的尾指针
	private int tailPointer = 0;
	
	public HeapArrays(){
		this.data = (T[]) new Object[maxSize];
	}
	
	public HeapArrays(int maxSize) {
		this.maxSize = maxSize;
		this.data = (T[]) new Object[maxSize];
	}
	
	/**
	 * 获取长度
	 * @return
	 */
        public int length(){
            return tailPointer - topPointer;
        }
	
        /**
         * 判断是否为空
         * @return
         */
	public boolean isEmpty(){
		if(length()<1){
			return true;
		}else{
			return false;
		}
	}
	
	/**
	 * 存队列
	 * @param e
	 */
	public void insert(T n){
		if (length()>=maxSize) {
			System.out.println("队列已满,自动扩容");
			this.maxSize = maxSize*2;
			T[] data2 = (T[]) new Object[maxSize];
			for(int i = 0;i<this.data.length;i++){
				data2[i] = data[i];
		        }
		this.data = data2;
                }
		data[tailPointer] = n;
                //尾位置后移
		tailPointer++;
        }
	
	/**
	 * 取队列
	 */
	public T get(){
		//如果为空
	    if (isEmpty()) {
               throw new RuntimeException("队列已空");
            }
	    T first = data[topPointer];
            //头位置后移
	    topPointer++;
	    if(topPointer>10){
		T[] data2 = (T[]) new Object[maxSize];
		for(int i = topPointer;i<=tailPointer;i++){
			data2[i-topPointer] = data[i];
		}
		this.data = data2;
		tailPointer-=11;
		topPointer-=11;
	    }
	    return first;
        }
	
	public String toString(){
		StringBuffer b = new StringBuffer();
		for(int i = topPointer;i<tailPointer;i++){
			b.append(data[i]+",");
		}
		return b.toString();
	}
}

 

双边队列

我们可以把get()、insert()方法修改成getRight()、getLeft()和insertRight()、insertLeft()方法,这个队列的两头都可以插入和删除。

 

总结

栈允许在栈顶压入(插入)数据,在栈顶弹出(移除)数据,但是只能访问最后一个插入的数据项,也就是栈顶元素。

队列(单向队列)只能在队尾插入数据,对头删除数据,并且只能访问对头的数据。而且队列还可以实现循环队列,它基于数组,数组下标可以从数组末端绕回到数组的开始位置。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值