动态数组3

动态数组实现队列

1 什么是队列

队列:指的就是我们在现实的生活中,假如我们去取快递在一个固定快递接受站里,先来的人总是第一个拿到快递,然后来的人,依次排队,等到了自己的时候才能拿到自己的快递,这样的结构就可以称为队列。
队列 (queue) 是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出的线性表,简称:FIFO,允许插入的一端称为队尾,允许删除的一端称为队头。假设队列是 q=(a1, a2,…, an) , 那么a1 就是队头的元素,这样我们删除时,总是可以从a1 开始,而插入时,从队尾开始。如下图所示:
在这里插入图片描述

2 队列的抽象数据类型

队列也是线性表,所以说队列也有类似于线性表的各种操作,不同的是插入数据时只能在队尾进行,删除数据时只能在队尾进行。

    public int getSize();
	public boolean isEmpty();
	public void clear();
	/**
	 * 入队一个新的的元素
	 * @param e
	 */
	public void enqueue(E e);
	/**
	 * 出队列
	 * @return
	 */
	public E dequeue();
	/**
	 * 获取队首元素(不删除)
	 * @return
	 */
	public E getFront();
	/**
	 * 获取队尾元素
	 * @return
	 */
	public E getRear();

队列的定义:

public interface Queue<E>

我们知道队列也是一种特殊的线性表结构,所以队列的操作也可以直接调用list.方法进行完成。
队列的入队和出队操作

/**
*入队
*/
public void enqueue(E e) {
		list.addLast(e);
		
	}
/**
*出队
*/
	public E dequeue() {
		// TODO Auto-generated method stub
		return list.removeFirst();
	}
循环队列
定义:

循环队列怎么产生的,我们使用普通的队列时,出队一个元素,其他的元素都向前移动,这样它的时间复杂度就提高了,所以使用循环列表来降低它的时间复杂度。
设计 :
每一次在增加或者出队时都是直接出队不用,所有的元素进行前移,这样就降低了时间复杂度,我们浪费了一个空间用来存放尾指针。如下图所示。
在这里插入图片描述

循环队列的实现

定义:public class ArrayQueueLoop<E> implements Queue<E>
成员变量

private E[] data;
	private int front;   //头指针
	private int rear;   //尾指针
	private int size;   元素的个数
	private static int DEFAULT_SIZE = 11;  //默认的大小

默认大小:我们浪费了一个空间,当我们要存10个是,它的大小就应该多一个,所以他的默认大小是11。

构造函数 :

public ArrayQueueLoop() {
		data = (E[]) new Object[DEFAULT_SIZE];
		front = 0;
		rear = 0;
		size = 0;
	}
	public ArrayQueueLoop(int capacity) {
		data = (E[]) new Object[capacity+1];
		front = 0;
		rear = 0;
		size = 0;
	}

队列——入队操作

@Override
	public void enqueue(E e) {
		if((rear+1)%data.length == front){
			resize(data.length*2-1);
		}
		data[rear] = e;
		rear = (rear + 1) % data.length;
		size++;
	}

** 队列——出队操作**

public E dequeue() {
		if(isEmpty()){
			throw new NullPointerException();
		}
		E e = data[front];
		front = (front+1) % data.length;
		size--;
		if(size < data.length/4 && data.length > DEFAULT_SIZE){
			//缩容
			resize(data.length/2+1);
		}
		return null;
	}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值