队列的百度百科概念:
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列作为常用的数据结构之一,生活工作体现的地方及其多,食堂打饭属于队列,医院看病属于队列,工作中的消息队列;
在工作使用的过程中,现在需要去自己了解一下队列的原理,接下来根据学习来自己写一个队列;
类似于栈,他也可以写一个统一的接口,以便有不同的队列实现方式
package com.study.queue;
/**
* Created by Administrator on 2019/8/11.
*/
public interface Queue<E> {
void add(E e);
E poll();
E peek();
boolean isEmpty();
int getSize();
}
基于数组实现的队列
package com.study.queue;
import com.study.arr.DynamicArray;
import java.util.Random;
/**
* Created by Administrator on 2019/8/11.
*/
public class ArrayQueue<E> implements Queue<E> {
private DynamicArray<E> dynamicArray;
public ArrayQueue(int capacity){
dynamicArray = new DynamicArray<E>(capacity);
}
public ArrayQueue(){
this(10);
}
/**
* addLast
*/
public void add(E e) {
dynamicArray.addLast(e);
}
public E poll() {
E e = dynamicArray.get(0);
dynamicArray.remove(0);
return e;
}
public E peek() {
return dynamicArray.get(0);
}
public boolean isEmpty() {
return dynamicArray.isEmpty();
}
public int getSize() {
return dynamicArray.length;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder("Array-length:").append(+dynamicArray.length).append("-content:[[[[[[");
for(int i=0;i<dynamicArray.length;i++){
if(i==0){
builder.append("队列的头部元素:");
}
builder.append(dynamicArray.get(i));
if(i!=dynamicArray.length-1){
builder.append(",");
}
}
return builder.toString();
}
public static void main(String[] args) {
ArrayQueue<Integer> arrayQueue = new ArrayQueue();
Random random = new Random();
for(int i=0;i<10;i++){
Integer integer = random.nextInt(10);
arrayQueue.add(integer);
}
System.out.println("队列的值:"+arrayQueue.toString());
arrayQueue.add(500);
System.out.println("队列的值:"+arrayQueue.toString());
System.out.println("获取队列的值:"+arrayQueue.peek());
System.out.println("队列的值:"+arrayQueue.toString());
System.out.println("获取队列的值:"+arrayQueue.poll());
System.out.println("队列的值:"+arrayQueue.toString());
System.out.println("队列的长度:"+arrayQueue.getSize());
System.out.println("队列是否为空:"+arrayQueue.isEmpty());
}
}
在写的代码之中,出队操作没有判断队列是否为空,当为空队列时去获取队列的值会出异常,当然这些东西写来也很简单,忘记写了
在这个简单的队列中,出队操作即获取队列头元素是属于O(n)操作,队列的其他的数据全部向前移动一位
所以呢后面学习循环队列,通过均摊复杂度分析使得出队的操作属于O(1)级别;
队列在工作中使用广泛,但是高楼大厦平地起,还是得从队列的基础开始。。。。。。。。。。。。。。。