佇列是乙個有序的線性列表,可以用陣列或鍊錶來實現,遵循先進先出、後進後出的原則。
佇列只能從列表的一端進行入隊另一端進行出隊操作。
佇列有兩種儲存資料的形式:
順序儲存:順序儲存的佇列也稱為順序佇列,內部使用陣列來實現的,順序佇列又分為非迴圈順序佇列和迴圈順序佇列。順序佇列是採用兩個指標,頭指標(front
)和尾指標(rear
)來分別指向佇列的頭部和尾部。當使用非迴圈順序佇列時,會出現假溢位現象,元素出隊以後不可再次使用佇列空間,因此可以使用迴圈順序佇列來迴圈的利用佇列空間。
非迴圈順序佇列的頭指標(front
)和尾指標(rear
)預設值都為-1,front
隨著佇列的出隊而增長,rear
隨著佇列的入隊而增長。
如下圖所示:
**實現:
public class arrayqueue
this.maxsize = maxsize;
this.front = -1; // 指向佇列頭部的前乙個位置
this.rear = -1; // 指向佇列尾部最後乙個資料位置
this.items = new int[maxsize];
}/**
* 判斷佇列是否儲存滿了
** @return
*/public boolean isfull()
/*** 判斷佇列是否為空
** @return
*/public boolean isempty()
public int size()
/*** 往佇列中新增資料
** @param object
* @return
*/public boolean put(int object)
this.items[++rear] = object;
return true;
}/**
* 消費佇列中的資料
** @return
*/public object take()
int result = this.items[++front];
this.items[front] = 0;
return result;
}/**
* 列印佇列中的資料
*/public void printqueue()
system.out.println("隊尾");}}
public class testarrayqueue else if (input < 0) catch (exception e)
} else }}
}
從上圖和**可以分析出隨著不停的進行出隊和入隊,front
和rear
都會持續的往隊尾部移動,當rear
移動到了陣列末尾之後,就無法再往佇列中新增元素了,也就是前面所說的假溢位現象,這種現象不是真正意義上記憶體空間不夠而導致的記憶體溢位,而是佇列中有空間卻不能夠進行入隊操作的假溢位。為了解決這種問題,充分利用佇列空間,可以將頭指標(front
)和尾指標(rear
)相連線,形成乙個迴圈佇列。
迴圈佇列的頭指標(front
)和尾指標(rear
)預設值都為0,陣列中下標為0
的位置不存放資料,當進行出隊、入隊操作時,頭指標和尾指標也會增長,只不過入隊時如果(rear + 1) % this.maxsize
會將real
賦值為0,也就重新指向了佇列的起始位置,出隊時如果(front + 1) % this.maxsize
會將front
也賦值為0。那麼隊為空的條件仍是:front = real
。
佇列滿的條件則是:(rear + 1) % maxsize == front
;
佇列中有效元素個數是:(rear + this.maxsize - front) % this.maxsize
;
(rear + 1) % this.maxsize
也可以表示為:
if (++i == this.maxsize)
(front + 1) % this.maxsize
也是如此
如下圖所示:
**實現:
public class circlearrayqueue
this.maxsize = maxsize;
this.items = new int[maxsize];
}/**
* 判斷佇列是否儲存滿了
** @return
*/public boolean isfull()
/*** 判斷佇列是否為空
** @return
*/public boolean isempty()
public int size()
/*** 往佇列中新增資料
** @param object
* @return
*/public boolean put(int object)
this.items[rear] = object;
rear = (rear + 1) % this.maxsize;
return true;
}/**
* 消費佇列中的資料
** @return
*/public object take()
int result = this.items[front];
this.items[front] = 0;
front = (front + 1) % this.maxsize;
return result;
}/**
* 列印佇列中的資料
*/public void printqueue()
system.out.println("隊尾");}}
public class testcirclearrayqueue else if (input < 0) catch (exception e)
} else }}
}
《資料結構與演算法》之佇列
資料結構與演算法 之鍊錶 資料結構與演算法 之鏈棧 資料結構與演算法 之排序 資料結構與演算法 之二分查詢 資料結構與演算法 之二叉樹 如何理解 佇列 你可以把它想象成排隊買票,先來的先買,後來的人只能站末尾,不允許插隊。先進者先出,這就是典型的 佇列 我們知道,棧只支援兩個基本操作 入棧 push...
資料結構與演算法之佇列
佇列介紹 1.佇列是乙個有序列表,可以用陣列或是鍊錶來實現。2.遵循先入先出的原則。即 先存入佇列的資料,要先取出。後存入的要後取出 3.示意圖 陣列模擬佇列 當我們將資料存入佇列時稱為 addqueue addqueue 的處理需要有兩個步驟 思路分析 1.將尾指標往後移 rear 1 當fron...
資料結構與演算法之佇列
前言 我寫資料結構與演算法這幾篇博文的目的是為了讓大家對資料結構與演算法有乙個基礎的認知。想更上一層樓的還須各位自學。佇列是資料結構的一種。他的原理是先進先出 後進後出 和棧,表一樣,佇列也分為順序佇列和鏈佇列。如圖 順序棧最開始時 順序佇列插入元素後 順序佇列刪除元素後 總結順序佇列的特點 順序佇...