溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java數(shù)據(jù)結(jié)構(gòu)中順序隊列和循環(huán)隊列的區(qū)別是什么

發(fā)布時間:2021-08-02 09:21:44 來源:億速云 閱讀:190 作者:chen 欄目:開發(fā)技術(shù)

這篇文章主要介紹“java數(shù)據(jù)結(jié)構(gòu)中順序隊列和循環(huán)隊列的區(qū)別是什么”,在日常操作中,相信很多人在java數(shù)據(jù)結(jié)構(gòu)中順序隊列和循環(huán)隊列的區(qū)別是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java數(shù)據(jù)結(jié)構(gòu)中順序隊列和循環(huán)隊列的區(qū)別是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

目錄
  • 隊列:

    • 順序隊列:

    • 代碼實(shí)現(xiàn):

  • 循環(huán)隊列:

    • 代碼實(shí)現(xiàn):

  • 總結(jié)

    隊列:

    隊列是一種受限制的線性表

    只允許在表的一端進(jìn)行插入,另一端進(jìn)行刪除

    插入的一端稱作隊尾,刪除的一端稱作隊頭

    具有先進(jìn)先出的特性

    順序隊列:

    隊列底層數(shù)據(jù)采用數(shù)組存儲

    設(shè)置隊頭指針front指向隊頭元素前一個位置,初始值為-1

    設(shè)置隊尾指針rear指向隊尾元素,初始值為-1

    判滿:rear == maxSize - 1

    判空:rear == front

    代碼實(shí)現(xiàn):

    //順序隊列
    public class ArrayQueue {
    	private int maxSize;    //數(shù)組的最大容量
    	private int front;        //隊頭指針
    	private int rear;        //隊尾指針
    	private int[] array;    //存放數(shù)據(jù)
    	public ArrayQueue(int arrMaxSize) {
    		maxSize = arrMaxSize;
    		array = new int[maxSize];
    		front = -1;        //指向隊頭的前一個位置
    		rear = -1;        //指向隊尾
    	}
    	//判斷隊列是否滿
    	public boolean isFull() {
    		return rear == maxSize - 1;
    	}
    	//判斷隊列是否空
    	public boolean isEmpty() {
    		return rear == front;
    	}
    	//入隊
    	public void addQueue(int n) {
    		//判斷隊列是否滿
    		if (isFull()) {
    			System.out.println("隊列滿");
    			return;
    		}
    		rear++;    //rear后移
    		array[rear] = n;
    	}
    	//出隊
    	public int getQueue() {
    		//判斷隊列是否空
    		if (isEmpty()) {
    			throw new RuntimeException("隊列為空");
    		}
    		front++;    //front后移
    		return array[front];
    	}
    	//取隊頭數(shù)據(jù)
    	public int headQueue() {
    		if (isEmpty()) {
    			throw new RuntimeException("隊列為空");
    		}
    		return array[front + 1];
    	}
    	//輸出隊列所有數(shù)據(jù)
    	public void showQueue() {
    		//遍歷輸出
    		if (isEmpty()) {
    			System.out.println("隊列為空");
                return;
    		}
    		for (int i = 0; i < array.length; i++) {
    			System.out.printf("array[%d] = %d\n", i, array[i]);
    		}
    	}
    }

    順序隊列存在假溢出現(xiàn)象,故使用循環(huán)隊列替代順序隊列

    循環(huán)隊列:

    隊列底層數(shù)據(jù)仍然采用數(shù)組存儲

    為了便于判空和判滿,在數(shù)組中預(yù)留一個空間,認(rèn)為只留下一個空間的時候隊列為滿

    設(shè)置隊頭指針front指向隊頭元素,初始值為0

    設(shè)置隊尾指針rear指向隊尾元素的后一個位置,初始值為0

    判滿:(rear + 1) % maxSize == front

    判空:rear == front

    取得當(dāng)前隊列有效數(shù)據(jù)個數(shù):(rear + maxSize - front) % maxSize

    代碼實(shí)現(xiàn):

    //循環(huán)隊列
    public class CircleQueue {
    	private int maxSize;    //數(shù)組的最大容量
    	private int front;        //隊頭指針
    	private int rear;        //隊尾指針
    	private int[] array;    //存放數(shù)據(jù)
    	public CircleQueue(int arrMaxSize) {
    		maxSize = arrMaxSize;
    		array = new int[maxSize];
    		front = 0;        //指向隊頭的前一個位置
    		rear = 0;        //指向隊尾
    	}
    	//判斷隊列是否滿
    	public boolean isFull() {
    		return (rear + 1) % maxSize == front;
    	}
    	//判斷隊列是否空
    	public boolean isEmpty() {
    		return rear == front;
    	}
    	//入隊
    	public void addQueue(int n) {
    		//判斷隊列是否滿
    		if (isFull()) {
    			System.out.println("隊列滿");
    			return;
    		}
    		array[rear] = n;
    		rear = (rear + 1) % maxSize;
    	}
    	//出隊
    	public int getQueue() {
    		//判斷隊列是否空
    		if (isEmpty()) {
    			throw new RuntimeException("隊列為空");
    		}
    		//保存front對應(yīng)的值
    		int value = array[front];
    		front = (front + 1) % maxSize;
    		return value;
    	}
    	//取隊頭數(shù)據(jù)
    	public int headQueue() {
    		if (isEmpty()) {
    			throw new RuntimeException("隊列為空");
    		}
    		return array[front];
    	}
    	//獲取當(dāng)前隊列有效數(shù)據(jù)個數(shù)
    	public int size() {
    		return (rear + maxSize - front) % maxSize;
    	}
    	//輸出隊列所有數(shù)據(jù)
    	public void showQueue() {
    		//遍歷輸出
    		if (isEmpty()) {
    			System.out.println("隊列為空");
                return;
    		}
    		//從front開始遍歷
    		for (int i = front; i < front + size(); i++) {
    			System.out.printf("array[%d] = %d\n", i % maxSize, array[i % maxSize]);
    		}
    	}
    }

    到此,關(guān)于“java數(shù)據(jù)結(jié)構(gòu)中順序隊列和循環(huán)隊列的區(qū)別是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI