前言
本文主要讲解的是队列的基础部分,包括其方法作用及其底层代码,底层代码是在数据结构1——动态数组的基础之上编辑出,重复文本本文中不再赘述。
需要强调的是,java本身有自己的队列包,猿友们可以利用import java.Queue来使用基本方法
动态数组
一、队列是什么
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。好似排队,先进后出。
这里需要强调,插入的一边是队尾,出去的一边是队首。
二、方法及底层代码
1.接口
代码如下
//从队尾进入,从队首出队,先进后出
public interface Queue<E>{
void enqueue(E e);//入队
E dequeue();//出队
E getFront();//看队首元素
int getSize();
boolean isEmpty();
}
2.getSize()
获取队列的长度
3.isEmpty()
布尔类型,判断队列是否为空
4.enqueue()
入队。及使用动态数组的addLast()在结构的尾部添加元素
代码如下
在这里 public void enqueue(E e){
array.addLast(e);
}
public void add(int index,E e){
if(size==data.length)
throw new IllegalArgumentException("Add failed. Array is full");
if(index<0||index>size)
resize(2*data.length);
for(int i=size-1;i>=index;i--){
data[i+1]=data[i];
data[index]=e;
size++;
}
}
public void addLast(E e){
if(size==data.length)
throw new IllegalArgumentException("AddLast failed. Srray is full.");
data[size]=e;
size++;
}
5.denqueue()
出队,即删除队首的第一个元素
代码如下
public void denqueue(E e){
romoveFirst(E e);
}
public E remove(int index){
if(index<0||index>=size)
throw new IllegalArgumentException("Get failed.Index is illegal");
E ret=data[index];
if(size==data.length/2)
resize(data.length/2);
for(int i=index+1;i<size;i++)
data[i-1]=data[i];
size--;
data[size]=null;
return ret;
}
public E removeFirst(){
return remove(0);
}
6.getFront()
获取队首元素,即出队处的元素
利用的是数组本身的查找功能
@Override
public E getFront(){
if(isEmpty())
throw new IllegalArgumentException("Cannot dequeue from an empty queue");
return data[front];
}
三.打印队列
@Override
public String toString(){
StringBuilder res=new StringBuilder();
res.append("Stack:");
res.append("[");
for(int i=0;i<array.getSize();i++){
res.append(array.get(i));
if(i!=array.getSize()-1)
res.append(",");
}
res.append("]top");
return res.toString();
}
}
总结
以上便是队列的基础部分。将在以后的博客中详细讲解循环队列的原理及代码。欢迎关注。