C語言設計迴圈雙端佇列

2022-06-13 10:12:10 字數 3076 閱讀 5914

題目描述

你的實現需要支援以下操作:

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...