队列
特点 : 先进先出
队列就像我们日常排队一样,先进去的人先出来。
实现:
数组实现
思路分析
1.如果尾指针rear小于数组队列的最大下标(arr.length-1),
则将数据存入rear所指的数组元素当中,否则无法存入数据。
rear == arr.length-1 (队列已满)
2.将尾指针往后移动:rear +1 ,当front == rear (空)
实现
public class ArrayQueueDemo {
private Object[] arr; // 该数据用于存放数据, 模拟队列
private int maxsize; // 表示数组的最大容量
private int front; // 队列头
private int rear; // 队列尾
//构造方法
public ArrayQueueDemo(int capacity) {
maxsize = capacity;
arr = new Object[capacity];
front = -1; //指向队列头部,分析出front是指向队列头的前一个位置.
rear = -1; // 指向队列尾,指向队列尾的数据(即就是队列最后一个数据)
}
//判断是否满队列
public boolean isFull() {
return rear == maxsize;
}
//判断是否空队列
public boolean isEmpty() {
return rear == front;
}
//数据添加
public void insert(int value) {
if(isFull()) {
System.out.println("队列已满,添加失败");
return;
}else {
rear ++; //让rear向后移动
arr[rear] = n;
}
}
//取出数据
public Object remove() {
//判断数据是否为空
if(isEmpty()){
throw new RuntimeException("队列为空,不能取出数据")
}
front ++ ;
return arr[front]
}
//数据的取出
public int reMove() {
//判断数据是否为空
if(isEmpty()) {
throw new RuntimeException("队列为空");
}
front++;
return arr[front];
}
}
队列的扩容,每次扩容两倍
//数据添加
public void insert(int value) {
if(isFull()) {
Object[] brr = new Object[arr.length * 2];
for (int i = 0; i < arr.length; i++) {
brr[i] = arr[i];
}
arr = brr;
}else {
//如果队列未满,分为两种情况 ,一种情况尾部指针已经指向最后一个元素,但是由于有出队列的情况所以size不等于maxsize0
//另一种情况是尾部没有指向最后一个元素
if(rear == maxsize-1) {
rear = -1;
}
arr[++rear] = value;
size++;//队列中实际个数加1
}
}
链表实现
public class Queue {
Node front;
Node rear;
int size=0;
public Queue(){
front=rear=null;
}
public void rudui(int x){
if (size==0){
Node s=new Node(x,null);
front=s;
rear=front;
size++;
}
Node s=new Node(x,null);
rear.next=s;
rear=s;
size++;
}
public int chudui(){
if (size==0){
return 0;
}
else {
int x= front.val;
front=front.next;
size--;
return x;
}
}
}