这个问题以前没有注意,现在觉得很有趣。
1 普通队列,在数据里面加一个size来判断数据总量的大小,再根据大小判断
是否空和满,empty和full我未写到方法里面。每次都需要额外对size进行操
作,高性能场景还是有部分性能损失。
front指向可用的元素,rear指向下一个可用的元素。
class QueueS{
private int max;
private long[] queArr;
private int front;
private int rear;
private int size;
/**
* 多一行数据,区分空和满
*
* @param s
*/
public QueueS(int s){
// 声明100。就可以存储到101
max = s;
size = 0;
queArr = new long[max];
front = 0;
rear = -1;
}
//插入
public void insert(long j){
if(rear == max -1){//最后一个元素
rear = -1;
}
queArr[++rear] = j;
size++;
}
//移除
public long remove(){
long temp = queArr[front++];
if(front == max){
front = 0;
}
size--;
return temp;
}
public long peek(){
return queArr[front];
}
public boolean isEmpty(){
return size == 0;
}
public boolean isFull(){
return size == max;
}
public int size(){
return size;
}
}
2 循环队列。
指定了数组大小为size。如果存储size的空间,可能出现无法判断数组到底是
空还是满的情况。因为空满,都是front == rear
我们可以把rear这个空间空出来。
如果不空出来的话:front =1 rear = 1. 可以判断为满或者空
如果空出rear front =1 rear =1 是空。
front = 1 rear = 0 是满。
队列的长度。如果rear > front 直接减去
如果 rear < front 。rear肯定是走过一圈了。(rear+max -front)%max 即可
class Queue{
private int max;
private long[] queArr;
private int front;
private int rear;
/**
* 多一条数据,实际存储数据为s
*
* @param s
*/
public Queue(int s){
max = s + 1;
queArr = new long[max];
front = 0;
rear = 0;
}
//尾部插入,插入
public boolean insert(long j){
//如果已经满了,不允许插入
if(isFull()) {
System.out.println("queue is full");
return false;
}
queArr[rear] = j;
rear = (rear+1)%max;
return true;
}
//移除, front 始终是非负数
public long remove(){
long temp = queArr[front];
front = (front+1)%max;
return temp;
}
public long peek(){
return queArr[front];
}
//相等即为空,因为满了不再让放入数据
public boolean isEmpty(){
return rear == front;
}
//
public boolean isFull(){
return (rear+1)%max == front;
}
public int size(){
return (rear-front+max)%max;
}
}