Nếu hàng đợi của bạn được dựa trên một mảng, sau đó vì lợi ích của hiệu quả, tôi sẽ khuyên bạn nên tạo một giáp hoặc hàng đợi "tròn", trong đó tối đa kích thước của hàng đợi là cố định, và về cơ bản bạn có một cái đầu và đuôi con trỏ điểm đó đến vị trí "đầu tiên" và "cuối cùng" trong mảng của hàng đợi và khi đuôi trỏ (hoặc giá trị chỉ mục) di chuyển đến vị trí "quá khứ" ở cuối mảng, nó thực sự di chuyển trở lại phần đầu của mảng. Một hàng đợi vô biên dựa trên một mảng sẽ là khủng khiếp không hiệu quả, như bạn sẽ cần phải tiếp tục phân bổ lại bộ nhớ mỗi khi bạn lấp đầy tối đa kích thước của mảng, và/hoặc cố các yếu tố để tái shuffle xuống mảng khi bạn loại bỏ đầu tiên phần tử của hàng đợi.
Sử dụng không thể thiếu loại chỉ số mảng cho head
và tail
chứ không phải là loại con trỏ thực tế, cùng với một bộ đếm để xác định tổng số các mặt hàng trong hàng đợi của bạn, enqueue của bạn và chức năng dequeue có thể nhìn đơn giản như:
template<typename T>
bool queue<T>::enqueue(const T& item)
{
if (count == array_size)
return false;
array[tail] = item;
tail = (tail + 1) % array_size;
count++;
return true;
}
template<typename T>
bool queue<T>::dequeue(T& item)
{
if (!count)
return false;
item = array[head];
head = (head + 1) % array_size;
count--;
return true;
}
bạn có thể mở rộng khái niệm này để bất cứ điều gì các chức năng khác mà bạn muốn, ví dụ, nếu bạn muốn có một chức năng riêng biệt như STL sử dụng để truy cập vào phần đầu của hàng đợi và thực sự "loại bỏ" một phần tử từ hàng đợi.
là bài tập về nhà này? –
Nếu bạn không hiểu đủ để thực hiện nó từ đầu, chỉ cần tiếp tục sử dụng phiên bản 'std' như bạn đã chứng minh. Nếu đây là bài tập về nhà, chỉ cần nhớ rằng một hàng đợi là đầu tiên trong, đầu tiên ra ngoài. –
Tôi tranh chấp tuyên bố của bạn rằng bạn "biết cách triển khai hàng đợi đơn giản". Cho đến nay bạn đã chỉ chứng minh rằng bạn có thể sử dụng một lớp thư viện gọi là "xếp hàng". –