package day02;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class Suan04Queue02 {
/*
* 数组实现队列,这个思路很难
* 注意:用链表实现队列和栈,和用数组实现栈逻辑都很简单,但是用数组实现队列就有些困难了
* 思路:用循环数组实现队列
* 因为队列存在先进先出的特点所以数组的前面会面临出队删除,那前面空出的位置不能浪费,如果每次出队都把所有数据前移那太麻烦
* 所以用循环队列出队空出的位置被入队利用
* */
public static class MyQueue{
public int[] arr;
/*
* 定义三个变量意义分别为:
* begin:标记队列的头
* end:标记队列的尾的下一个位置(end永远比队列最后的数据多1,方便直接入队)
* size:队列的长度
* */
public int begin;
public int end;
public int size;
public MyQueue(int limit){
begin = 0;
end = 0;
size = 0;
arr = new int[limit];
}
//判断队列是否满了,满了则不能插入
public void push(int value){
if(size==arr.length){
throw new RuntimeException("队列满了不再加");
}
//没满则可插入,将队列长度+1
size++;
//入队
arr[end] = value;
//入队后将end位置下移,nextIndex的作用就是判断end是否到了数组的最后,若是到了则循环end=0
end = nextIndex(end);
}
//出队是返回并删除数组的begin位置的数
public int poll(){
if(size == 0){
throw new RuntimeException("队列空不能再减");
}
//队列长度减1
size--;
//同理
int temp = arr[begin];
begin = nextIndex(begin);
return temp;
}
public int nextIndex(int end){
if(end == arr.length){
return 0;
}
return (end+1);
}
public static void main(String[] args) {
int oneTestDataNum = 10;
int value = 10;
int testTimes = 10;
for (int i = 0; i < testTimes; i++) {
MyQueue myQueue = new MyQueue(100);
Queue<Integer> queue = new LinkedList<>();
for (int j = 0; j < oneTestDataNum; j++) {
int numq = (int) (Math.random() * value);
if (queue.isEmpty()) {
myQueue.push(numq);
queue.offer(numq);
} else {
if (Math.random() < 0.5) {
myQueue.push(numq);
queue.offer(numq);
} else {
if (myQueue.poll()!=queue.poll()) {
System.out.println("oops!");
}
}
}
}
}
System.out.println("finish!");
}
}
}
数组实现队列java
最新推荐文章于 2022-04-21 05:50:32 发布