通過兩個鏈表節點指針實現隊列,一個當作隊頭,一個當作隊尾,入隊就是往尾節點後插入,退隊就是刪除頭節點
template<class T>
struct ListNode {
T data;
ListNode<T> *next;
ListNode(const T & data) {
this->data = data;
this->next = nullptr;
}
};
template<class T>
class Queue {
public:
Queue();
Queue(const Queue<T> & q);
~Queue();
void enQueue(const T & elem); // 入隊
void deQueue(); // 退隊
const T & front() const { return m_head->data; } // 返回隊頭元素
const T & back() const { return m_tail->data; } // 返回隊尾元素
const size_t size() const { return m_size; } // 返回隊列長度
bool empty() const { return 0 == m_size; } // 判斷隊列是否爲空
private:
ListNode<T> *m_head, *m_tail; // 記錄頭節點和尾節點
size_t m_size;
};
template<class T>
Queue<T>::Queue()
{
m_head = m_tail = nullptr;
m_size = 0;
}
template<class T>
Queue<T>::Queue(const Queue<T>& q)
{
ListNode<T> * temp = q.m_head;
while (nullptr != temp) {
enQueue(temp->data);
temp = temp->next;
}
}
template<class T>
Queue<T>::~Queue()
{
ListNode<T> * temp = nullptr;
while (nullptr != m_head) {
temp = m_head;
m_head = m_head->next;
delete temp;
temp = nullptr;
}
delete temp;
temp = nullptr;
}
template<class T>
void Queue<T>::enQueue(const T & elem)
{
if (empty()) {
m_head = m_tail = new ListNode<T>(elem);
}
else {
m_tail->next = new ListNode<T>(elem);
m_tail = m_tail->next;
}
m_size++;
}
template<class T>
void Queue<T>::deQueue()
{
/*try {
if (empty()) {
throw std::out_of_range;
}
else {
ListNode<T> *temp = m_head;
m_head = m_head->next;
delete temp;
temp = nullptr;
m_size--;
}
}
catch (std::out_of_range err) {
}*/
if (!empty()) {
ListNode<T> *temp = m_head;
m_head = m_head->next;
delete temp;
temp = nullptr;
m_size--;
}
}
int main() {
Queue<int> q;
q.deQueue();
q.enQueue(1);
q.enQueue(2);
q.enQueue(3);
Queue<int> q2(q);
q2.deQueue();
q.deQueue();
q.deQueue();
q.deQueue();
q.enQueue(3);
return 0;
}