数组模拟队列操作

队列操作

队列操作特点是先进先出,队列的删除只能操作头,插入只能操作尾。可以用一个数组存放数据,设计一个指针指向头一个指针指向尾,插入的时候调整尾指针,删除的时候移动头。同时增加了数组扩容和清除数组前面的多余空间。

本例子中添加了泛型,适用于任何数据类型。栈操作也可以按进行添加。看过一个面试题将字符串倒序排列,这里就可以使用栈来实现。

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();
	}
}

测试类

public class Test {
	
	public static void main(String[] args) {
		HeapArrays<Integer> demo = new HeapArrays<>(5);
		for(int i = 0;i<6;i++){
			demo.insert(i);
			System.out.println("队列的内容:"+demo.toString());
		}
		System.out.println("队列的长度:"+demo.length());
		for(int i = 0;i<6;i++){
			System.out.println("队列的数为:"+demo.get());
			System.out.println("队列的内容:"+demo.toString());
		}
	}
}

测试结果:

队列的内容:0,
队列的内容:0,1,
队列的内容:0,1,2,
队列的内容:0,1,2,3,
队列的内容:0,1,2,3,4,
队列已满,自动扩容
队列的内容:0,1,2,3,4,5,
队列的长度:6
队列的数为:0
队列的内容:1,2,3,4,5,
取出队列的数为:1
队列的内容:2,3,4,5,
取出队列的数为:2
队列的内容:3,4,5,
取出队列的数为:3
队列的内容:4,5,
取出队列的数为:4
队列的内容:5,
取出队列的数为:5
队列的内容:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值