什麼是數據結構?
相互之間存在一種或多種特定關係的數據元素的集合。java
一、什麼是隊列?
先進先出(FIFO:first in first out)數組
普通隊列:隊列有兩種排發:一、、每處理一條數據,後面的數據都會依次前進一位。(效率較低)。二、、每處理一條數據,就會去下一條數據的空間處理下一位。(佔用內存,浪費空間)數據結構
若是使用售票員和排隊買票的說法,那麼第一種是排隊的人動,第二種是售票員動;測試
環形隊列:有順時針和逆時針之說,以第二種方法排隊。(優勢:提升效率的同時,能夠充分使用內存,不會佔用空間)spa
建立隊列:傳入一個隊列的容量初始化一個隊列
銷燬隊列:銷燬已存在的指定隊列,由於建立隊列是使用數組從建立的,因此必需要使用銷燬數組的方式進行銷燬,不然會形成內存泄漏
清空隊列:將這指定隊列中的元素清空,使該隊列的長度爲0(傳入隊尾、隊首和隊列長度三項置爲0便可)
判空隊列:判斷指定隊列是不是空隊列(即判斷隊列長度是否爲0,若是等於0則返回true,不然返回false)
判滿隊列:判斷指定隊列的隊列長度和隊列容量是否相同(相同則返回true,不然返回false)
隊列長度:返回指定隊列的元素個數據,統計隊列的長度
新元素入隊:自動加入到指定隊列的最後一位(若是隊列是滿的,返回false,若是隊列是空的,則加入隊列的最後一位,隊尾作自增操做並 取餘隊列容量,指向下一個位置,並使隊列的長度加一)
首元素出隊:刪除該隊列的第一個元素(若是當前隊列是空的,返回false,若是不爲空,則獲取當前隊列的隊頭,進行刪除,隊頭作自增操做並 取餘隊列容量,指向下一個位置,並使隊列的長度減一)指針
注:此處作取餘操做,是由於須要考慮隊尾值若是超過了容量的狀況, 被取餘數 < 取餘數 結果 等於本身自己,避免數組越界。code
遍歷隊列:輸出該隊列的全部元素(使用 for 循環,以隊首的下標爲起始,以隊列的長度+隊首的下標(此處是由於隊首的數字增長了,那麼隊首到長度之間的循環次數就會縮減,因此長度須要加上隊首的下標)爲終結,對 i 進行自增,並對 i 取餘容量(此處注意:是對隊列的容量進行取餘,不要對隊列的長度進行取餘)一樣進行取餘操做)
新元素入隊和首元素出隊操做,由於是環形隊列,因此當環形隊列走了一圈以後隊或隊伍再進行自增就會下標越界,致使程序錯誤,因此須要取餘於隊列容量blog
下方附上隊列數據結構代碼:隊列
package util; public class MyQueue { //隊列數組指針 private Object[] myQueue; //隊列長度 private int myQueueLen; //隊列容量 private int myQueueCapacity; //隊列頭的指針 private int myQueueHead; //隊列尾的指針 private int myQueueTail; public MyQueue() { super(); } /** * 初始化隊列內存空間 * @param queueCapacity 隊列容量 * @return */ public MyQueue(int queueCapacity){ myQueueCapacity = queueCapacity; // 申請內存空間 myQueue = new Object[myQueueCapacity]; clearQueue(); } /** * 將數組賦值爲null,垃圾回收器會自動回收 */ public void deleteQueue(){ myQueue = null; } /** * 清空隊列 */ public void clearQueue(){ myQueueHead = 0; myQueueTail = 0; myQueueLen = 0; } /** * 使用三目運算符,判斷隊列的長度是否等於0 * @return boolean 相等返回true,不相等返回false */ public boolean isNullQueue(){ return 0 == myQueueLen ? true : false; } /** * 使用三目運算符,判斷隊列的長度是否等於隊列的容量 * @return boolean 相等返回true,不相等返回false */ public boolean isFullQueue(){ return myQueueLen == myQueueCapacity ? true : false; } /** * 直接根據數組的length方法返回隊列的長度 * @return */ public int queueLen(){ return myQueueLen; } /** * 判斷隊列是否已經滿隊,添加元素到隊列中,並更新隊頭和長度的下標 * @param element * @return */ public boolean addElement(Object element){ if(isFullQueue()) { return false; } else { myQueue[myQueueTail] = element; ++ myQueueTail; myQueueTail = myQueueTail % myQueueCapacity; myQueueLen ++; return true; } } /** * 判斷隊列是不是空隊,刪除隊列中的第一個元素,並更新隊頭和長度的下標 * @return * @throws Exception */ public Object delElement() throws Exception{ if (isNullQueue()){ throw new Exception("隊列爲空,不能刪除元素"); } else { Object element = myQueue[myQueueHead]; myQueueHead = ++ myQueueHead % myQueueCapacity; myQueueLen --; return element; } } public void queueTraverse(){ for (int i = myQueueHead; i < myQueueLen + myQueueHead; i++) { Object element = myQueue[i % myQueueCapacity]; System.out.println(element.toString()+""); } } }
測試數據結構效果:內存
package use.test; import test.entity.Person; import util.*; public class TestMyQueue { public static void main(String[] args) { MyQueue myQueue = new MyQueue(4); Person person1 = new Person(); person1.setAddress("合肥市蜀山區"); person1.setName("張三"); person1.setAge(22); Person person2 = new Person(); person2.setAddress("南京市江寧區"); person2.setName("李四"); person2.setAge(44); Person person3 = new Person(); person3.setAddress("合肥市廬陽區"); person3.setName("王五"); person3.setAge(35); //添加隊列 myQueue.addElement(person1); myQueue.addElement(person2); myQueue.addElement("wangwu"); myQueue.addElement(person3); System.out.println("隊列的長度:"+myQueue.queueLen()); myQueue.queueTraverse(); //刪除隊列 try { //刪除時,若是隊列爲空,則會跑出Exception異常 Object element1 = myQueue.delElement(); System.out.println("當前刪除的元素爲" + element1.toString()); Object element2 = myQueue.delElement(); System.out.println("當前刪除的元素爲" + element2.toString()); } catch (Exception e) { e.printStackTrace(); } System.out.println("隊列的長度:"+myQueue.queueLen()); myQueue.queueTraverse(); //添加隊列 myQueue.addElement(5); myQueue.addElement(6); myQueue.addElement(7); System.out.println("隊列的長度:" + myQueue.queueLen()); myQueue.queueTraverse(); //清空隊列 // myQueue.clearQueue(); if (myQueue.isNullQueue()) { System.out.println("隊列爲空"); } if (myQueue.isFullQueue()) { System.out.println("隊列爲滿"); } System.out.println("隊列的長度:" + myQueue.queueLen()); } }