演算法學習之五:佇列
阿新 • • 發佈:2019-01-03
佇列的概念:
佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(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);
好了,佇列就講解得差不多了。所以一般涉及到在隊頭刪除,隊尾新增的,可以考慮用佇列來實現。