队列

队列

**队列(queue)是只容许在一端进行插入操作,而在另一端进行删除操作的线性表,即先进先出。**容许插入的一端为队尾,容许删除的一端称为对头。

顺序储存

每在数组头部即对头删除一次时间复杂度就是O(n)。设法通过移动下标而不移动元素降低时间复杂度。

循环队列

那么头尾相接的顺序存储结构就是循环链表。

  • 队列满的条件是(tail+1)%max== head
/**
  * <p>Title: QueueArray.java</p>
  * <p>Description: 循环队列:先入先出</p>
  * @version 1.0
*/
public class QueueArray<E> {
//	容器
	private Object[] list;
//	队列头
	private int head;
//	队尾
	private int tail;
//	当前队列长度
	private int lenght;
//	最大长度
	private int max;
	
//	检索并删除队列的头
	public E remove() {
		if (lenght <= 0) {
			throw new IllegalStateException("没东西了");
		}
		@SuppressWarnings("unchecked")
		E ele = (E)list[head];
		if (ele == null) {
			return null;
		}
		list[head++] = null;
		lenght--;
		return ele;
	}
//	检索但是不删除队列的头
	@SuppressWarnings("unchecked")
	public E peek() {
		return (E) list[head];
	}
//	入队:队列尾进入
	public E push(E e) throws Exception {
		if (e == null) {
			throw new Exception("喂,你传的东西有问题");
		}
		if (lenght != 0&& tail!=head) {
//		保留一个元素空间,当tail到达head前时一格队列满
			if ((tail+1)%max == head) {
				throw new Exception("队列满了,不要了");
			}
		}
//		循环
		if (tail== max-1) {
			if (head!=0) {
				list[tail++] = e;
				if (tail == max) {
					tail =0;
				}
			}
		}else {
			list[tail++] = e;
		}
		lenght++;
		return e;
	}
	@Override
	public String toString() {
		return "QueueArray [list=" + Arrays.toString(list) + ", head=" + head + ", tail=" + tail + ", lenght=" + lenght
				+ ", max=" + max + "]";
	}
	public QueueArray(int max) {
		this.max = max;
		this.head = 0;
		this.tail = 0;
		this.lenght = 0;
		list = new Object[max];
	}
	private QueueArray() {
		super();
	}
}

链式储存

链队列就是队列的链式存储结构其实就是线性表的单链表,只不过是只能尾进头出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值