佇列是一種特殊的線性表(線性結構),特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。
佇列按照邏輯資料結構可以分為順序佇列和迴圈佇列.
順序佇列存在假溢位的現象,如下圖所示.
佇列中的元素只能從尾部入隊,從頭部出隊.如果這時 a1,a2 出隊,front 後移動到 2,如圖:
但是現在佇列明明有三個空位,卻只能向佇列中存乙個元素,這就是假溢位,針對這種情況,提出了迴圈佇列的概念,就是後面滿了,就再從頭開始,也就是頭尾相接的迴圈。
陣列和鍊錶
陣列模擬佇列的實現方式
(1) 我們用兩個變數front和rear分別記錄佇列前後端的下標,front隨著資料輸出而改變,rear隨著資料輸入而改變,
front和rear的定義如下:
如下圖所示:
(2) 資料入隊(addqueue)
1) 將尾針往後移動: rear + 1 ,當front == rear 就說明這是個空佇列了.
2) 若尾針 rear < maxsize -1 ,則新來的元素可以存入rear所在的位置處, rear = maxsize -1 說明佇列滿了.
3) front的初始索引為-1,指向佇列的頭部,是頭部元素的前乙個位置,rear的初始索引為-1,指向佇列的尾部元素,
陣列模擬迴圈佇列的實現方式
這是對陣列模擬佇列的優化,我們在這裡把陣列看作是乙個環形(通過front和rear取模來實現),我們需要注意以下幾點:
1). front 變數的含義: front 就指向佇列的第乙個元素, 也就是說 arr[front] 就是佇列的第乙個元素 ,front 的初始值 = 0
2). rear 變數的含義:rear 指向佇列的最後乙個元素的後乙個位置. 因為希望空出乙個空間做為約定.rear 的初始值 = 0
3). 當佇列滿時,條件是 (rear + 1) % maxsize == front【滿】
4). 對隊列為空的條件, rear == front 空
5). 當我們這樣分析, 佇列中有效的資料的個數 (rear + maxsize - front) % maxsize //eg: rear = 1 front = 0 ,則只有乙個元素在陣列中.
6). 我們就可以在原來的佇列上修改得到,乙個環形佇列
**實現如下:
//陣列實現迴圈佇列,我們需要知道的常見方法定義(功能)有:判斷佇列是否為滿,判斷佇列是否為空,新增資料到佇列,出隊,顯示所有資料,顯示佇列有效資料個數,顯示佇列的頭資料
/** * @description:陣列實現的迴圈佇列
* @author: tian
* @time: 2020/7/21 8:06
*/class
circlearray
public
boolean
isfull()
public
boolean
isempty()
public
void
addqueue
(int n)
arr[rear]
= n;
rear =
(rear +1)
% maxsize;
}public
intgetqueue()
int value = arr[front]
; front =
(front +1)
% maxsize;
return value;
}//當前佇列的有效資料個數
public
intsize()
//遍歷
public
void
showqueue()
int s =
size()
;for
(int i = front ; i < front +s;i++)}
}
資料結構與演算法二
資料結構作為一門學科主要研究資料的各種邏輯結構和儲存結構,以及對資料的各種操作。因此,主要有三個方面的內容 資料的邏輯結構 資料的物理儲存結構 對資料的操作 或演算法 通常,演算法的設計取決於資料的邏輯結構,演算法的實現取決於資料的物理儲存結構。邏輯結構 是指資料物件中資料元素之間的相互關係。其實這...
資料結構與演算法(二)
函式的漸近增長 給定兩個函式 f n 和 g n 如果存在乙個整數n,使得對於所有的n n,f n 總是比g n 大,那麼我們說f n 的增長漸近快於g n 如圖 演算法時間複雜度的定義 在進行時間演算法分析時,語句總的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t ...
資料結構與演算法(二)
介紹內容 大o表示法 1 演算法時間度量指標 賦值語句 一條賦值語句同時包含了表示式計算 和 變數儲存兩個基本資源2 聯絡 所以賦值語句被執行的次數與演算法執行的時間直接掛鉤 a 5b 6c 10for i in range n for j in range n x i j y j j z i i ...