数据结构复习笔记系列3 — 队列
Posted Putarmor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构复习笔记系列3 — 队列相关的知识,希望对你有一定的参考价值。
1.队列定义
队列:只允许在一端进行数据插入操作,在另外一端进行数据删除操作的特殊线性表,具有先入先出的特点。进行插入操作的一端称为队尾(tail/rear),进行删除操作的一端称为队头(head/front)。举个例子来说,就像我们平时买东西一样,排的队就可以看作一个队列。
2.手动实现循环队列
1)实现队列方式
队列可以用链表也可以用数组去实现,用链表实现表现更优一点,当使用数组时,因为队列先进先出的特性,删除元素时,其余元素都要整体移动,这样时间复杂度会达到O(n)。
2)集合中队列继承体系
根据Java集合体系来看,LinkedList类实现了Deque(双端队列)接口,而Deque接口又继承了Queue(普通队列)接口,也就是说LinkedList类既可以当双端队列去使用,也可以当普通队列去使用。
3)LinkedList源码
底层采用双向链表实现
add方法调用linklast方法,offer调用add方法,推荐使用offer添加元素;offer满了后返回false;而add满了后会抛出异常。
linklast是是尾巴插法
class MyCircularQueue
private int front;
private int rear; //代表队尾也代表当前可以存放元素的下标
private int[] elem;
public MyCircularQueue(int k)
this.elem = new int[k];
//入队
public boolean enQueue(int value)
if(isFull())
return false;
//放到rear下标,rear向后走
this.elem[rear] = value;
rear = (rear+1)%this.elem.length;
return true;
//出队
public boolean deQueue()
if(isEmpty())
return false;
//移动front下标就可以了
front = (front+1)%this.elem.length;
return true;
//得到队头元素
public int Front()
if(isEmpty())
return -1;
return this.elem[front];
//得到队尾元素 .....比较重要
public int Rear()
if(isEmpty())
return -1;
return this.elem[(rear-1+this.elem.length)%this.elem.length];
//判空
public boolean isEmpty()
if(front == rear)
return true;
return false;
//判满,基于数组所以要判满
public boolean isFull()
if((rear+1)%this.elem.length == front)
return true;
return false;
以上是关于数据结构复习笔记系列3 — 队列的主要内容,如果未能解决你的问题,请参考以下文章