源码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103#include <iostream>template<typename ItemType>class Queue{private: struct Node { Node* next; ItemType data; Node() : next(nullptr) {} explicit Node(const ItemType& item) : next(nullptr), data(item) {} explicit Node(ItemType&& item) : next(nullptr), data(std::move(item)) {} }; Node* head; Node* tail; Queue(const Queue&) = delete; Queue& operator=(const Queue&) = delete;public: Queue(){ head = tail = new Node(); } ~Queue(){ while (head != nullptr) { Node* temp = head; head = head->next; delete temp; } } bool Pop(){ if (IsEmpty()) return false; Node* temp = head->next; head->next = temp->next; delete temp; if (head->next == nullptr) { tail = head; } return true; } ItemType* Peek() const{ if (tail->next == nullptr) { return nullptr; } return &tail->next->data; } void Empty(){ while (!IsEmpty()) Pop(); } bool IsEmpty() const{ return head->next == nullptr; } bool Enqueue(const ItemType& item){ Node* temp = new Node(item); if (temp == nullptr) return false; tail->next = temp; tail = temp; return true; } bool Enqueue(ItemType&& item){ Node* temp = new Node(std::move(item)); if (temp == nullptr) return false; tail->next = temp; tail = temp; return true; } bool Dequeue(ItemType& item){ if (IsEmpty()) return false; Node* temp = head->next; item = std::move(temp->data); head->next = temp->next; delete temp; if (head->next == nullptr) tail = head; return true; } // 迭代器支持 class Iterator { private: Node* current; public: Iterator(Node* node) : current(node) {} ItemType& operator*() { return current->data; } Iterator& operator++() { current = current->next; return *this; } bool operator!=(const Iterator& other) const { return current != other.current;} }; Iterator begin() { return Iterator(head->next); } Iterator end() { return Iterator(nullptr); }};template<typename ItemType>std::ostream& operator<<(std::ostream& os, Queue<ItemType>& queue) { os << "["; for (const auto& item : queue) { os << item; if (&item != &(*queue.end())) { os << ", "; } } os << "]"; return os;}测试代码1234567891011121314151617181920212223// Test Codeint main(){ Queue<int> q; for (int i = 0; i < 20; i++) { q.Enqueue(i); } std::cout<< q << std::endl; for (int i = 0; i < 10; i++) { int temp; q.Dequeue(temp); } std::cout<< q << std::endl; for (int i = 0; i < 10; i++) { std::cout << q.Peek() << std::endl; } std::cout<< q << std::endl; q.Empty(); std::cout<< q << std::endl; return 0;}