題目描述
你的實現需要支援以下操作:設計思路mycirculardeque(k):建構函式,雙端佇列的大小為k。
insertfront():將乙個元素新增到雙端佇列頭部。 如果操作成功返回 true。
insertlast():將乙個元素新增到雙端佇列尾部。如果操作成功返回 true。
deletefront():從雙端佇列頭部刪除乙個元素。 如果操作成功返回 true。
deletelast():從雙端佇列尾部刪除乙個元素。如果操作成功返回 true。
getfront():從雙端佇列頭部獲得乙個元素。如果雙端隊列為空,返回 -1。
getrear():獲得雙端佇列的最後乙個元素。 如果雙端隊列為空,返回 -1。
isempty():檢查雙端佇列是否為空。
isfull():檢查雙端佇列是否滿了。
儲存結構如下:
typedef
struct
mycirculardeque;
實現該迴圈佇列,需要注意以下幾點:
判斷隊列為空? 當收尾指標相等,隊列為空,head == tail
判斷佇列已滿? 當尾指標的下一位等於頭指標,佇列已滿,(tail + 1 + capacity) % capacity == head;
初始化佇列時? 首尾指標從0開始, head = tail = 0
從頭部插入資料? head 指標向前移動, head = (head - 1 + capacity) % capacity
從尾部插入資料? tail 指標向後移動, tail = (tail + 1) % capacity
從頭部刪除資料? head 指標向後移動, head = (head + 1) % capacity
從尾部刪除資料? tail 指標向前移動, tail = (tail - 1 + capacity) % capacity
從尾部讀取資料? 考慮頭部插入(head 前移一位)和尾部插入(插入後,tail後移一位),所以讀取data[(tail - 1 + capacity) % capacity]
**實現
本題目選自 leetcode 641 題,以下為 c 語言實現**
實現細節學習引用 leetcode 題解,題解入口
typedef
struct
mycirculardeque;
// 建立雙端迴圈佇列及初始化
mycirculardeque*
mycirculardequecreate
(int k)
bool mycirculardequeisfull
(mycirculardeque* obj)
;// 從隊頭插入資料,成功返回true
bool mycirculardequeinsertfront
(mycirculardeque* obj,
int value)
obj -> head =
(obj -> head -
1+ obj -> capacity)
% obj -> capacity;
obj -> data[obj -> head]
= value;
return true;
}// 從隊尾插入資料,成功返回true
bool mycirculardequeinsertlast
(mycirculardeque* obj,
int value)
obj -> data[obj -> tail]
= value;
obj -> tail =
(obj -> tail +1)
% obj -> capacity;
return true;
}bool mycirculardequeisempty
(mycirculardeque* obj)
;// 從隊頭刪除資料,成功返回true
bool mycirculardequedeletefront
(mycirculardeque* obj)
obj -> head =
(obj -> head +1)
% obj -> capacity;
return true;
}//從隊尾刪除資料,成功返回true
bool mycirculardequedeletelast
(mycirculardeque* obj)
obj -> tail =
(obj -> tail -
1+ obj -> capacity)
% obj -> capacity;
return true;
}// get the front item from the deque
intmycirculardequegetfront
(mycirculardeque* obj)
return obj -> data[obj -> head];}
// get the last item from the deque
intmycirculardequegetrear
(mycirculardeque* obj)
return obj -> data[
(obj -> tail -
1+ obj -> capacity)
% obj -> capacity];}
// checks whether the circular deque is empty or not.
bool mycirculardequeisempty
(mycirculardeque* obj)
// checks whether the circular deque is full or not
bool mycirculardequeisfull
(mycirculardeque* obj)
void
mycirculardequefree
(mycirculardeque* obj)
設計迴圈雙端佇列C
設計實現雙端佇列。你的實現需要支援以下操作 mycirculardeque k 建構函式,雙端佇列的大小為k。insertfront 將乙個元素新增到雙端佇列頭部。如果操作成功返回 true。insertlast 將乙個元素新增到雙端佇列尾部。如果操作成功返回 true。deletefront 從雙...
設計迴圈雙端佇列
題目描述 設計實現雙端佇列。你的實現需要支援以下操作 mycirculardeque k 建構函式,雙端佇列的大小為k。insertfront 將乙個元素新增到雙端佇列頭部。如果操作成功返回 true。insertlast 將乙個元素新增到雙端佇列尾部。如果操作成功返回 true。deletefro...
設計迴圈雙端佇列
眾所周知,佇列是先進先出,隊尾進,隊頭出 那麼怎麼來實現雙端迴圈佇列呢?我們知道實現迴圈佇列中比較難的地方隊尾進,隊頭出在於怎麼讓rear 1就到陣列的front 或者 出隊的時候怎麼讓front到front 我們可以這樣 rear rear 1 length或者front front 1 leng...