數據結構--隊列

什麼是數據結構?
相互之間存在一種或多種特定關係的數據元素的集合。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());
        
    }
}
相關文章
相關標籤/搜索