队列基本思想,先进先出
1,数组模拟队列
这种实现方式有很大的缺陷:数组只能使用一次,所以下面也给出了循环队列的实现方式。
结构图
两个变量指向点说明
代码实现
package Queue;
public class ArrayQueueDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayQueue queue = new ArrayQueue(2);
queue.addQueeu(1);
queue.addQueeu(2);
//queue.addQueeu(1) 队列已满
queue.showQueue();
queue.getQueue();
queue.getQueue();
//queue.getQueue(); 队列为空,无法取值
}
}
class ArrayQueue{
private int maxSize;
private int[] arr;
private int front;
private int rear;
public ArrayQueue (int maxSize){
this.maxSize = maxSize;
arr = new int [maxSize];
front = -1;
rear = -1;
}
//判断是否为空
public Boolean isEmpty() {
return front == rear;
}
//判断是否满了
public Boolean isFull() {
return rear == maxSize-1;
}
//入队
public void addQueeu(int n) {
if(isFull()) {
throw new RuntimeException("队列已满");
}
rear++;
arr[rear] = n;
}
//出队
public int getQueue() {
if(isEmpty()) {
throw new RuntimeException("队列为空,无法取值");
}
front++;
return arr[front];
}
//显示所有数据
public void showQueue() {
if(isEmpty()) {
return;
}
for(int i=0; i<arr.length; i++) {
System.out.printf("arr[%d]=%d\n",i,arr[i]);
}
}
}
2,环形数组模拟队列
图结构说明
解释说明: front前面的一个位置是为空的(front移动空位也就跟着移动),假设数组大小为4,那么实际就只能存3个数据。 留一个空位是为了给判空和判满这两个条件做区分的。
代码实现如下
package Queue;
public class CircleArrayQueueDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
CirleQueue c = new CirleQueue(3);
System.out.println(c.isEmpty());//true
c.addQueeu(1);
c.addQueeu(2);
//c.addQueeu(3);队列已满
System.out.println(c.isFull());//true
c.showQueue();
System.out.println(c.getQueue());
c.addQueeu(3);
c.showQueue();
System.out.println(c.isFull());//true
}
}
class CirleQueue{
private int maxSize;
private int[] arr;
//默认为0,所有不用初始化
private int front;
private int rear;
public CirleQueue (int maxSize){
this.maxSize = maxSize;
arr = new int [maxSize];
}
//判断是否为空
public Boolean isEmpty() {
return front == rear;
}
//判断是否满了
public Boolean isFull() {
//以front为0,rear为maxSize-1为例,需要空一个位置
return (rear+1)%maxSize == front;
}
//入队
public void addQueeu(int n) {
if(isFull()) {
throw new RuntimeException("队列已满");
}
arr[rear] = n;
rear = (rear+1)%maxSize;
}
//出队
public int getQueue() {
if(isEmpty()) {
throw new RuntimeException("队列为空,无法取值");
}
//front指向队列的第一个元素
int value = arr[front];
front = (front+1)%maxSize;
return value;
}
public void showQueue() {
if(isEmpty()) {
return;
}
for(int i=front; i<front+size(); i++) {
System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
}
}
//获取队列大小
public int size() {
return (rear+maxSize-front)%maxSize;
}
}