日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java数据结构与算法:队列

發(fā)布時(shí)間:2025/4/16 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java数据结构与算法:队列 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 隊(duì)列的介紹

隊(duì)列 (Queue)是另一種限定性的線性表,它只允許在表的一端插入元素,而在另一端刪除元素,所以隊(duì)列具有先進(jìn)先出(Fist In Fist Out, 縮寫為FIFO)的特性。在隊(duì)列中,允許插入的一端叫做隊(duì)尾(rear),允許刪除的一端則稱為隊(duì)頭(front)。 在隊(duì)列中插入一個(gè)新元素的操作簡稱為進(jìn)隊(duì)或入隊(duì),新元素進(jìn)隊(duì)后就成為新的隊(duì)尾元素;從隊(duì)列中刪除一個(gè)元素的操作簡稱為出隊(duì)或離隊(duì),當(dāng)元素出隊(duì)后,其后繼元素就成為新的隊(duì)頭元素

假設(shè)隊(duì)列為q=(a1,a2,…,an),那么a1就是隊(duì)頭元素,an則是隊(duì)尾元素。隊(duì)列中的元素是按照a1,a2,…,an的順序進(jìn)入的, 退出隊(duì)列也必須按照同樣的次序依次出隊(duì),也就是說,只有在a1,a2,…,an-1都離開隊(duì)列之后,an才能退出隊(duì)列。

隊(duì)列(Queue),是一種線性存儲(chǔ)結(jié)構(gòu)。它有以下幾個(gè)特點(diǎn):

  • 隊(duì)列中數(shù)據(jù)是按照”先進(jìn)先出(FIFO, First-In-First-Out)”方式進(jìn)出隊(duì)列的。
  • 隊(duì)列只允許在”隊(duì)首”進(jìn)行刪除操作,而在”隊(duì)尾”進(jìn)行插入操作。

隊(duì)列通常包括的兩種操作:入隊(duì)列 和 出隊(duì)列。

1.1 隊(duì)列的示意圖

隊(duì)列中有10,20,30共3個(gè)數(shù)據(jù)。

1.2 出隊(duì)列

出隊(duì)列前:隊(duì)首是10,隊(duì)尾是30。
出隊(duì)列后:出隊(duì)列(隊(duì)首)之后。隊(duì)首是20,隊(duì)尾是30。

1.3 入隊(duì)列

入隊(duì)列前:隊(duì)首是20,隊(duì)尾是30。
入隊(duì)列后:40入隊(duì)列(隊(duì)尾)之后。隊(duì)首是20,隊(duì)尾是40。

2. 隊(duì)列的順序存儲(chǔ)結(jié)構(gòu)

隊(duì)列的順序存儲(chǔ)結(jié)構(gòu)稱為順序隊(duì)列。順序隊(duì)列可以利用一個(gè)一維數(shù)組和兩個(gè)指針來實(shí)現(xiàn)。一維數(shù)組用來存儲(chǔ)當(dāng)前隊(duì)列中的所有元素,兩個(gè)指針front和rear分別指向當(dāng)前隊(duì)列的隊(duì)首元素和隊(duì)尾元素,分別稱為隊(duì)首指針和隊(duì)尾指針。

3. 隊(duì)列的鏈接存儲(chǔ)結(jié)構(gòu)

隊(duì)列的鏈接存儲(chǔ)結(jié)構(gòu)是用一個(gè)單鏈表存放隊(duì)列元素的。隊(duì)列的鏈接存儲(chǔ)結(jié)構(gòu)稱為鏈隊(duì)列。由于隊(duì)列只允許在表尾進(jìn)行插入操作、在表頭進(jìn)行刪除操作,因此,鏈隊(duì)需設(shè)置兩個(gè)指針:隊(duì)頭指針front和隊(duì)尾指針rear,分別指向單鏈表的第一個(gè)結(jié)點(diǎn)(表的頭結(jié)點(diǎn))和最后一個(gè)結(jié)點(diǎn)(隊(duì)尾結(jié)點(diǎn))。

4. 隊(duì)列的Java實(shí)現(xiàn)

JDK包Queue中的也提供了”隊(duì)列”的實(shí)現(xiàn)。JDK中的Queue接口就是”隊(duì)列”,它的實(shí)現(xiàn)類也都是隊(duì)列,用的最多的是LinkedList

4.1 Java實(shí)現(xiàn)一

數(shù)組實(shí)現(xiàn)的隊(duì)列,能存儲(chǔ)任意類型的數(shù)據(jù)

/*** Java : 數(shù)組實(shí)現(xiàn)“隊(duì)列”,只能存儲(chǔ)int數(shù)據(jù)*/ public class ArrayQueue {private int[] mArray;private int mCount;public ArrayQueue(int sz) {mArray = new int[sz];mCount = 0;}// 將val添加到隊(duì)列的末尾public void add(int val) {mArray[mCount++] = val;}// 返回“隊(duì)列開頭元素”public int front() {return mArray[0];}// 返回“棧頂元素值”,并刪除“棧頂元素”public int pop() {int ret = mArray[0];mCount--;for (int i=1; i<=mCount; i++)mArray[i-1] = mArray[i];return ret;}// 返回“棧”的大小public int size() {return mCount;}// 返回“棧”是否為空public boolean isEmpty() {return size()==0;}public static void main(String[] args) {int tmp=0;ArrayQueue astack = new ArrayQueue(12);// 將10, 20, 30 依次推入棧中astack.add(10);astack.add(20);astack.add(30);// 將“棧頂元素”賦值給tmp,并刪除“棧頂元素”tmp = astack.pop();System.out.printf("tmp=%d\n", tmp);// 只將“棧頂”賦值給tmp,不刪除該元素.tmp = astack.front();System.out.printf("tmp=%d\n", tmp);astack.add(40);System.out.printf("isEmpty()=%b\n", astack.isEmpty());System.out.printf("size()=%d\n", astack.size());while (!astack.isEmpty()) {System.out.printf("size()=%d\n", astack.pop());}} }

運(yùn)行結(jié)果

tmp=10 tmp=20 isEmpty()=false size()=3 size()=20 size()=30 size()=40

結(jié)果說明:ArrayQueue是通過數(shù)組實(shí)現(xiàn)的隊(duì)列,而且ArrayQueue中使用到了泛型,因此它支持任意類型的數(shù)據(jù)。

4.2 Java實(shí)現(xiàn)二

Java的 Collection集合 中自帶的”隊(duì)列”(LinkedList)的示例

import java.util.Stack;/*** 用“棧”實(shí)現(xiàn)隊(duì)列*/ public class StackList<T> {// 向隊(duì)列添加數(shù)據(jù)時(shí):(01) 將“已有的全部數(shù)據(jù)”都移到mIn中。 (02) 將“新添加的數(shù)據(jù)”添加到mIn中。private Stack<T> mIn = null;// 從隊(duì)列獲取元素時(shí):(01) 將“已有的全部數(shù)據(jù)”都移到mOut中。(02) 返回并刪除mOut棧頂元素。private Stack<T> mOut = null;// 統(tǒng)計(jì)計(jì)數(shù)private int mCount = 0;public StackList() {mIn = new Stack<T>();mOut = new Stack<T>();mCount = 0;}private void add(T t) {// 將“已有的全部數(shù)據(jù)”都移到mIn中while (!mOut.empty())mIn.push(mOut.pop());// 將“新添加的數(shù)據(jù)”添加到mIn中mIn.push(t);// 統(tǒng)計(jì)數(shù)+1mCount++;}private T get() {// 將“已有的全部數(shù)據(jù)”都移到mOut中while (!mIn.empty())mOut.push(mIn.pop());// 統(tǒng)計(jì)數(shù)-1mCount--;// 返回并刪除mOut棧頂元素return mOut.pop();}private int size() {return mCount;}private boolean isEmpty() {return mCount==0;}public static void main(String[] args) {StackList slist = new StackList();// 將10, 20, 30 依次推入棧中slist.add(10);slist.add(20);slist.add(30);System.out.printf("isEmpty()=%b\n", slist.isEmpty());System.out.printf("size()=%d\n", slist.size());while(!slist.isEmpty()) {System.out.printf("%d\n", slist.get());}} }

運(yùn)行結(jié)果

tmp=10 tmp=20 isEmpty()=false size()=3 tmp=20 tmp=30 tmp=40

4.3 隊(duì)列的數(shù)組實(shí)現(xiàn)

// Queue.java // demonstrates queue // to run this program: C>java QueueApp class Queue{private int maxSize;private long[] queArray;private int front;private int rear;private int nItems; //--------------------------------------------------------------public Queue(int s) // constructor{maxSize = s;queArray = new long[maxSize];front = 0;rear = -1;nItems = 0;} //--------------------------------------------------------------public void insert(long j) // put item at rear of queue{if(rear == maxSize-1) // deal with wraparoundrear = -1;queArray[++rear] = j; // increment rear and insertnItems++; // one more item} //--------------------------------------------------------------public long remove() // take item from front of queue{long temp = queArray[front++]; // get value and incr frontif(front == maxSize) // deal with wraparoundfront = 0;nItems--; // one less itemreturn temp;} //--------------------------------------------------------------public long peekFront() // peek at front of queue{return queArray[front];} //--------------------------------------------------------------public boolean isEmpty() // true if queue is empty{return (nItems==0);} //--------------------------------------------------------------public boolean isFull() // true if queue is full{return (nItems==maxSize);} //--------------------------------------------------------------public int size() // number of items in queue{return nItems;} //--------------------------------------------------------------} // end class Queue class QueueApp{public static void main(String[] args){Queue theQueue = new Queue(5); // queue holds 5 itemstheQueue.insert(10); // insert 4 itemstheQueue.insert(20);theQueue.insert(30);theQueue.insert(40);theQueue.remove(); // remove 3 itemstheQueue.remove(); // (10, 20, 30)theQueue.remove();theQueue.insert(50); // insert 4 more itemstheQueue.insert(60); // (wraps around)theQueue.insert(70);theQueue.insert(80);while( !theQueue.isEmpty() ) // remove and display{ // all itemslong n = theQueue.remove(); // (40, 50, 60, 70, 80)System.out.print(n);System.out.print(" ");}System.out.println("");} // end main()} // end class QueueApp

4.4 隊(duì)列的鏈表實(shí)現(xiàn)

// linkQueue.java // demonstrates queue implemented as double-ended list // to run this program: C>java LinkQueueApp class Link{public long dData; // data itempublic Link next; // next link in list // -------------------------------------------------------------public Link(long d) // constructor{ dData = d; } // -------------------------------------------------------------public void displayLink() // display this link{ System.out.print(dData + " "); } // -------------------------------------------------------------} // end class Link class FirstLastList{private Link first; // ref to first itemprivate Link last; // ref to last item // -------------------------------------------------------------public FirstLastList() // constructor{first = null; // no items on list yetlast = null;} // -------------------------------------------------------------public boolean isEmpty() // true if no links{ return first==null; } // -------------------------------------------------------------public void insertLast(long dd) // insert at end of list{Link newLink = new Link(dd); // make new linkif( isEmpty() ) // if empty list,first = newLink; // first --> newLinkelselast.next = newLink; // old last --> newLinklast = newLink; // newLink <-- last} // -------------------------------------------------------------public long deleteFirst() // delete first link{ // (assumes non-empty list)long temp = first.dData;if(first.next == null) // if only one itemlast = null; // null <-- lastfirst = first.next; // first --> old nextreturn temp;} // -------------------------------------------------------------public void displayList(){Link current = first; // start at beginningwhile(current != null) // until end of list,{current.displayLink(); // print datacurrent = current.next; // move to next link}System.out.println("");} // -------------------------------------------------------------} // end class FirstLastList class LinkQueue{private FirstLastList theList; //--------------------------------------------------------------public LinkQueue() // constructor{ theList = new FirstLastList(); } // make a 2-ended list //--------------------------------------------------------------public boolean isEmpty() // true if queue is empty{ return theList.isEmpty(); } //--------------------------------------------------------------public void insert(long j) // insert, rear of queue{ theList.insertLast(j); } //--------------------------------------------------------------public long remove() // remove, front of queue{ return theList.deleteFirst(); } //--------------------------------------------------------------public void displayQueue(){System.out.print("Queue (front-->rear): ");theList.displayList();} //--------------------------------------------------------------} // end class LinkQueue class LinkQueueApp{public static void main(String[] args){LinkQueue theQueue = new LinkQueue();theQueue.insert(20); // insert itemstheQueue.insert(40);theQueue.displayQueue(); // display queuetheQueue.insert(60); // insert itemstheQueue.insert(80);theQueue.displayQueue(); // display queuetheQueue.remove(); // remove itemstheQueue.remove();theQueue.displayQueue(); // display queue} // end main()} // end class LinkQueueApp

4.5 優(yōu)先級隊(duì)列

// priorityQ.java // demonstrates priority queue // to run this program: C>java PriorityQApp class PriorityQ{// array in sorted order, from max at 0 to min at size-1private int maxSize;private long[] queArray;private int nItems; //-------------------------------------------------------------public PriorityQ(int s) // constructor{maxSize = s;queArray = new long[maxSize];nItems = 0;} //-------------------------------------------------------------public void insert(long item) // insert item{int j;if(nItems==0) // if no items,queArray[nItems++] = item; // insert at 0else // if items,{for(j=nItems-1; j>=0; j--) // start at end,{if( item > queArray[j] ) // if new item larger,queArray[j+1] = queArray[j]; // shift upwardelse // if smaller,break; // done shifting} // end forqueArray[j+1] = item; // insert itnItems++;} // end else (nItems > 0)} // end insert() //-------------------------------------------------------------public long remove() // remove minimum item{ return queArray[--nItems]; } //-------------------------------------------------------------public long peekMin() // peek at minimum item{ return queArray[nItems-1]; } //-------------------------------------------------------------public boolean isEmpty() // true if queue is empty{ return (nItems==0); } //-------------------------------------------------------------public boolean isFull() // true if queue is full{ return (nItems == maxSize); } //-------------------------------------------------------------} // end class PriorityQ class PriorityQApp{public static void main(String[] args){PriorityQ thePQ = new PriorityQ(5);thePQ.insert(30);thePQ.insert(50);thePQ.insert(10);thePQ.insert(40);thePQ.insert(20);while( !thePQ.isEmpty() ){long item = thePQ.remove();System.out.print(item + " "); // 10, 20, 30, 40, 50} // end whileSystem.out.println("");} // end main() //-------------------------------------------------------------} // end class PriorityQApp

4.6 隊(duì)列的應(yīng)用

6個(gè)人圍成圈數(shù)數(shù),數(shù)到3的人退出,問最后退出的人是誰?

public class MyQueue {private Object datas[];private int pushIndex;//入隊(duì)的下標(biāo)private int popIndex; //出隊(duì)的下標(biāo)private int counts;//記錄數(shù)據(jù)的個(gè)數(shù)public MyQueue(int size){datas = new Object[size];}public MyQueue(){this(10);}public boolean isEmpty(){return counts == 0;}public String toString(){StringBuilder mess = new StringBuilder();for (int i = popIndex; i <= counts; i++) {mess.append(datas[i % datas.length] + ",");}return mess + "";}public boolean isFull(){return counts == datas.length;}/*** 入隊(duì)列* @param data*/public void push(Object data) {if (isFull()) {return;}datas[pushIndex++ % datas.length] = data;counts++;}public Object popup(){Object data = datas[popIndex++ % datas.length];counts--;return data;} } public class TestApp {public static void main(String[] args) {//初始化隊(duì)列MyQueue queue = new MyQueue(6);//六個(gè)人入隊(duì)for (int i = 0;i < 6; i++) {queue.push(i + 1);}//數(shù)數(shù)int counts = 0;//計(jì)數(shù)器while (!queue.isEmpty()) {Object d = queue.popup();counts++;//判斷if (counts % 3 == 0) {System.out.println(d);} else {queue.push(d);//再放進(jìn)隊(duì)列}}} }

4.7 循環(huán)隊(duì)列

原文出處:http://www.cnblogs.com/skywang12345/p/3562279.html

總結(jié)

以上是生活随笔為你收集整理的Java数据结构与算法:队列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。