队列简介
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
在队列中插入一个元素称为入队,从队列中删除一个元素称为出队。
队列分为:
【】单向队列:只能在一端插入数据,另一端删除数据。
【】双向队列:每一端都可以进行插入数据和删除数据操作。
【】优先级队列:数据项按关键字进行排序,关键字最小(或者最大)的数据项往往在队列的最前面,数据项在插入的时候都会插入到合适的位置以确保队列的有序。
单向队列
设计思路
两个指针:
Front:指向队头,默认0
Rear:指向队尾,默认1
入队:
Rear+1,在其指向的位置插入元素
出队:
取出Fron处的元素,Front+1
到顶端以后,Rear变成-1,再插入就会循环
删除数据同样会循环
如果队列满了,就插不进去了
代码实现
package queue;
public class Queuetest1 {
public static void main(String[] args) {
MyQueue myQueue = new MyQueue(3);
myQueue.insert(1);
myQueue.insert(2);
myQueue.insert(3);
myQueue.insert(4);//提示队列已满
while(!myQueue.isEmpty()){
System.out.println(myQueue.remove());
}
System.out.println(myQueue.remove());//null
}
}
//循环的单向队列
class MyQueue{
private Object[] eleData;//存放数据的数组
private int maxSize;//队列的最大长度
private int rear; //队尾指针
private int front;//队头指针
private int nElems;//队列中元素个数
//构造方法
public MyQueue(int size){
this.maxSize = size;
eleData = new Object[size];
rear = -1;
front = 0;
nElems = 0;
}
//入队
public void insert(Object data){
//判断队列是不是满了,满了新数据就不应该插入了
if(nElems == maxSize){
System.out.println("队列已满,新数据不能再插入了!");
}else{
if((rear+1)==maxSize){
rear = -1;
}
eleData[++rear] = data;
nElems ++;
}
}
//出队
public Object remove(){
Object removeObj = null;
if(nElems != 0){
removeObj = eleData[front];
eleData[front] = null;// 清空元素
nElems --; //队列实际长度减一
if((front+1)==maxSize){
front = 0;
}else{
front++;
}
}
return removeObj;
}
//读队头的值
public Object peek(){
//判断队列是不是空队列
if(nElems == 0){
return null;
}else {
return eleData[front];
}
}
//判断队列是否为空
public boolean isEmpty(){
return (nElems == 0);
}
//判断对了是不是满队列
public boolean isFull(){
return (nElems == maxSize);
}
//返回队列大小
public int getSize(){
return nElems;
}
}