1. 程式人生 > >演算法學習之五:佇列

演算法學習之五:佇列

佇列的概念:

佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。
要著重強調的地方:
(1)所有刪除的操作,都在隊頭
(2)所有插入的操作,都在隊尾
(3)佇列遵循先進先出

程式碼說明佇列的運用:

正好我今天看到一個華為2016校招(刪數)的筆試題目,就拿來在這講解說明好了。
先看題目:
有一個數組a[N]順序存放0~N-1,要求每隔兩個數刪掉一個數,到末尾時迴圈至開頭繼續進行,求最後一個被刪掉的數的原始下標位置。以8個數(N=7)為例:{0,1,2,3,4,5,6,7},0->1->2(刪除)->3->4->5(刪除)->6->7->0(刪除),如此迴圈直到最後一個數被刪除。

分析題目:
每隔2個數刪除1個數,並且迴圈下去,那麼可以認為這隔的2個數相當於放在隊尾做插入操作,刪除的1個數相當於在隊頭做刪除操作,迴圈下去直到最後一個被刪除。

這裡寫圖片描述

程式碼實現:

public class Queue {

    private int[] list = new int[100];//先隨機設定一個大小是100的陣列
    private int head = 0;//頭指標
    private int tail = 0;//尾指標

    public Queue(int[] srcList){
        System.arraycopy(srcList,0,list,0,srcList.length);
        head = 0
; tail = srcList.length;//tail指向最後一個元素的下個位置 } /** * 每隔2個,將這2個放入隊尾,刪掉1個就是出對 * @return */ public int delete2each(){ //heal 不等於tail: while(head<tail){ for(int i = 0;i<2;i++){ list[tail] = list[head]; Log.e("hxy"
,"要入隊的"+list[tail]); head++; tail++; } Log.e("hxy","要刪除的"+list[head]); head++; } return list[--head]; } }

測試:

        int[] list5 = {0,1,2,3,4,5};
        Queue queue = new Queue(list5);
        int head = queue.delete2each();
        Log.e("hxy","head:"+head);

這裡寫圖片描述

好了,佇列就講解得差不多了。所以一般涉及到在隊頭刪除,隊尾新增的,可以考慮用佇列來實現。