循环队列的java结构_Java数据结构——循环队列
普通順序隊(duì)列存在的問題
在普通順序隊(duì)列中,入隊(duì)的操作就是先將尾指針rear右移一個(gè)單位,然后將元素值賦值給rear單位。出隊(duì)時(shí),則是頭指針front后移一個(gè)單位。像這樣進(jìn)行了一定數(shù)量的入隊(duì)和出隊(duì)操作后,可能會(huì)出現(xiàn)這樣的情況:
尾指針rear已指到數(shù)組的最后有一個(gè)元素,即rear==MaxLen-1,此時(shí)若再數(shù)組的前面部分可能還有很多閑置空間,即這種溢出并非是真的沒有可用的存儲(chǔ)空間,故稱這種溢出現(xiàn)象為“假溢出”。顯然,必須要解決這一塊假溢出的問題,否則順序隊(duì)列就沒有太多使用價(jià)值。
循環(huán)隊(duì)列
循環(huán)隊(duì)列的存儲(chǔ)結(jié)構(gòu),頭、尾指針都和普通順序隊(duì)列相同。不同的只是將隊(duì)列視為“環(huán)狀結(jié)構(gòu)”,即data[0]為緊接著data[MaxLen-1]的單元,為相鄰的元素,首位成為一個(gè)環(huán)。結(jié)構(gòu)如下:
隊(duì)列為空的條件:rear==front;
隊(duì)列為滿的條件:(rear+1)%maxSize==front
實(shí)現(xiàn):
public class MyDlQueue {
private Object data[];
private int rear;
private int front;
private int maxSize = 10;
// 初始化隊(duì)列
public MyDlQueue(int maxSize) {
if (maxSize >= 0) {
this.maxSize = maxSize;
rear = front = 0;
data = new Object[maxSize];
} else {
throw new RuntimeException("初始化隊(duì)列大小不能小于0");
}
}
// 判空
public boolean empty() {
return rear == front ? true : false;
}
// 判滿
public boolean full() {
//maxsize加1是因?yàn)棰偬幍膔ear指向隊(duì)尾的后一個(gè)
return ((rear + 1) % (maxSize + 1)) == front ? true : false;
}
// 入隊(duì)
public boolean add(Object obj) {
if (full()) {
throw new RuntimeException("隊(duì)滿");
} else {
rear = rear % maxSize; //防止數(shù)組越界
data[rear] = obj;
rear = (rear + 1) % (maxSize + 1); //①
return true;
}
}
// 出隊(duì)
public Object poll() {
if (empty()) {
throw new RuntimeException("隊(duì)空");
} else {
Object value = data[front];
data[front] = null;
front = (front + 1) % maxSize;
return value;
}
}
// 獲取隊(duì)首元素
public Object peek() {
if (empty()) {
throw new RuntimeException("隊(duì)空");
} else {
return data[front];
}
}
// 返回隊(duì)列長(zhǎng)度
public int length() {
return rear - front;
}
public static void main(String[] args) {
MyDlQueue queue = new MyDlQueue(5);
queue.add(1);
queue.add(2);
queue.add(3);
queue.add(4);
queue.add(5);
System.out.println(queue.length());
System.out.println(queue.empty());
System.out.println(queue.peek());
System.out.println(queue.poll());
queue.add("aaa");
for (Object obj : queue.data) {
System.out.print(obj + " ");
}
}
}
總結(jié)
以上是生活随笔為你收集整理的循环队列的java结构_Java数据结构——循环队列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果8plus国行和美版有什么区别
- 下一篇: 在java面向对象编程中_谈一谈你对封装