Type* base,容量 capacity。front (隊頭索引)、back (隊尾下一插入索引)。front == back;判滿:(back+1)%capacity == front (犧牲一格區分滿/空)。#include <iostream>
#include <cstddef>
using namespace std;
template <typename Type>
class CircleQueue {
static const size_t INIT_SIZE = 8;
Type* base;
size_t capacity;
size_t front, back;
public:
explicit CircleQueue(size_t sz = INIT_SIZE)
: capacity(sz > INIT_SIZE ? sz : INIT_SIZE), front(0), back(0) {
base = new Type[capacity];
}
~CircleQueue() { destroy(); }
CircleQueue(const CircleQueue&) = delete;
CircleQueue& operator=(const CircleQueue&) = delete;
bool empty() const { return front == back; }
bool full() const { return (back + 1) % capacity == front; }
size_t size() const { return (back + capacity - front) % capacity; }
// 入隊
void push(const Type& x) {
if (full()) {
cerr << "Queue full\n"; return;
}
base[back] = x;
back = (back + 1) % capacity;
}
// 出隊
void pop() {
if (empty()) { cerr << "Queue empty\n"; return; }
front = (front + 1) % capacity;
}
// 取隊頭
bool getFront(Type& x) const {
if (empty()) return false;
x = base[front];
return true;
}
void clear() { front = back = 0; }
void destroy() { delete[] base; base = nullptr; capacity = front = back = 0; }
void show() const {
if (empty()) { cout << "Queue empty\n"; return; }
for (size_t i = front; i != back; i = (i + 1) % capacity)
cout << base[i] << ' ';
cout << '\n';
}
};
// 測試
int main() {
CircleQueue q;
q.push(1); q.push(2); q.push(3);
cout << "Size: " << q.size() << '\n'; // 3
q.show(); // 1 2 3
int f; q.getFront(f); cout << "Front: " << f << '\n'; // 1
q.pop(); q.show(); // 2 3
q.clear(); q.show(); // empty
return 0;
}
| 操作 | 時間 | 說明 |
|---|---|---|
| push / pop | O(1) | 單純指標移動與賦值 |
| getFront | O(1) | 直接索引 |
| size | O(1) | 模運算計算 |
capacity 實際可存 capacity-1 個元素。若需滿用量,可額外加 bool fullFlag 或維護 count 變數。(idx+1)%cap 實現指標環繞,size() 用 (back-front+cap)%cap 避免負數。pop 僅移動 front,舊元素析構延遲至覆寫或 destroy。嚴格 RAII 需在 pop 呼叫 base[front].~Type()。#include <queue> queueq; // 底層 deque,動態擴容 q.push(1); q.front(); q.pop();
std::queue 以 deque 為預設容器,支援動態增長、無容量上限、介面更豐富。手寫循環佇列適合嵌入式、共享記憶體、高效能固定緩衝區場景。