Java數(shù)組模擬優(yōu)先級(jí)隊(duì)列數(shù)據(jù)結(jié)構(gòu)的實(shí)例
優(yōu)先級(jí)隊(duì)列
如果我們給每個(gè)元素都分配一個(gè)數(shù)字來標(biāo)記其優(yōu)先級(jí),不妨設(shè)較小的數(shù)字具有較高的優(yōu)先級(jí),這樣我們就可以在一個(gè)集合中訪問優(yōu)先級(jí)最高的元素并對(duì)其進(jìn)行查找和刪除操作了。這樣,我們就引入了優(yōu)先級(jí)隊(duì)列 這種數(shù)據(jù)結(jié)構(gòu)。 優(yōu)先級(jí)隊(duì)列(priority queue) 是0個(gè)或多個(gè)元素的集合,每個(gè)元素都有一個(gè)優(yōu)先權(quán),對(duì)優(yōu)先級(jí)隊(duì)列執(zhí)行的操作有(1)查找(2)插入一個(gè)新元素 (3)刪除 一般情況下,查找操作用來搜索優(yōu)先權(quán)最大的元素,刪除操作用來刪除該元素 。對(duì)于優(yōu)先權(quán)相同的元素,可按先進(jìn)先出次序處理或按任意優(yōu)先權(quán)進(jìn)行。
Java數(shù)組模擬隊(duì)列
隊(duì)列是一種特殊的線性表,它只允許在表的前端進(jìn)行刪除操作,而在表的后端進(jìn)行插入操作。進(jìn)行插入操作的端稱為隊(duì)尾,進(jìn)行刪除操作的端稱為隊(duì)頭。這也就是我們平常經(jīng)常用說到的先進(jìn)先出原則(FIFO)。Java 中的 List 就可以作為隊(duì)列來使用,在隊(duì)列尾部添加元素則使用 list.add 方法,從隊(duì)列頭部刪除元素則使用 list.remove 方法。
Java數(shù)組模擬優(yōu)先級(jí)隊(duì)列結(jié)構(gòu)實(shí)例:
package datastruct; import java.util.Arrays; import java.util.Comparator; /** * 用數(shù)組模擬 優(yōu)先級(jí)隊(duì)列 優(yōu)先級(jí)高的排前、先出 線性表結(jié)構(gòu) * 類似使用了比較器的 TreeSet、TreeMap */ public class SimulatePriorityQueue { public static void main(String[] args) { SimulatePriorityQueue queue = new SimulatePriorityQueue(4); // SimulateQueue queue = new SimulateQueue(); // System.out.println("取出元素:" + queue.remove()); queue.insert(1); queue.insert(3); queue.insert(2); queue.insert(5); queue.insert(4); System.out.println("size:" + queue.size()); System.out.println("peek:" + queue.peek()); System.out.println("取出元素:" + queue.remove()); System.out.println("取出元素:" + queue.remove()); System.out.println("取出元素:" + queue.remove()); System.out.println("取出元素:" + queue.remove()); // System.out.println("取出元素:" + queue.remove()); System.out.println("size:" + queue.size()); System.out.println(); } private int mSize = 3; //大小 private int[] mArray; //數(shù)組 private int mNextItem; //下一個(gè)位置,也可當(dāng)作 當(dāng)前的元素?cái)?shù) public SimulatePriorityQueue() { mArray = new int[mSize]; mNextItem = 0; } public SimulatePriorityQueue(int size) { this.mSize = size; mArray = new int[mSize]; mNextItem = 0; } /** * 插入元素 * @param item */ public void insert(int item) { if (!isFull()) { mArray[mNextItem++] = item; for (int i = 0; i < mNextItem; i++) {//冒泡排序 for (int j = 0; j < mNextItem - 1; j++) { if (mArray[j] > mArray[j + 1]) { mArray[j] = mArray[j + 1] + 0 * (mArray[j + 1] = mArray[j]); System.out.println(Arrays.toString(mArray)); } } } System.out.println(Arrays.toString(mArray)); } else { System.out.println("----不能插入元素了,隊(duì)列已滿----"); } } /** * 移出元素 先進(jìn)先出 * @return */ public int remove() { if (!isEmpty()) { return mArray[--mNextItem]; } else { throw new IllegalArgumentException("沒有元素可以取出了"); } } /** * 查看前面的元素 * @return */ public int peek() { return mArray[mNextItem - 1]; } /** * 是否為空 * @return */ public boolean isEmpty() { return mNextItem == 0; } /** * 是否滿 * @return */ public boolean isFull() { return mNextItem == mSize; } /** * size * @return */ public int size() { return mNextItem; } }
輸出結(jié)果:
[1, 0, 0, 0] [1, 3, 0, 0] [1, 2, 3, 0] [1, 2, 3, 0] [1, 2, 3, 5] ----不能插入元素了,隊(duì)列已滿---- size:4 peek:5 取出元素:5 取出元素:3 取出元素:2 取出元素:1 size:0
相關(guān)文章
Springboot中使用Redisson+AOP+自定義注解實(shí)現(xiàn)訪問限流與黑名單攔截
本文主要介紹了Springboot中使用Redisson+AOP+自定義注解實(shí)現(xiàn)訪問限流與黑名單攔截,包含針對(duì)用戶IP限流,整個(gè)接口的訪問限流,以及對(duì)某個(gè)參數(shù)字段的限流,并且支持請(qǐng)求限流后處理回調(diào),感興趣的可以了解一下2024-02-02使用Filter過濾器中訪問getSession()要轉(zhuǎn)化
這篇文章主要介紹了使用Filter過濾器中訪問getSession()要轉(zhuǎn)化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Java 5個(gè)人坐在一起(有關(guān)第五個(gè)人歲數(shù)的問題)
利用遞歸的方法,遞歸分為回推和遞推兩個(gè)階段。要想知道第五個(gè)人歲數(shù),需知道第四人的歲數(shù),依次類推,推到第一人(10歲),再往回推,需要的朋友可以參考下2017-02-02