一、使用模板来实现队列泛化。
二、由于不知道数据类型,所以没有对item进行初始化。
#pragma once
#include <iostream>
template <typename T1>
struct QLinkedList
{
T1 value;
QLinkedList<T1>* next;
QLinkedList(const T1& item, QLinkedList<T1>* next_ = nullptr)//用于初始化data和next
{
value = item;
next = next_;
}
};
template <typename T2>
class MyQueue
{
private:
// 双重代替,用T2去代替T1,T1在其他地方定义。
QLinkedList<T2>* front;
QLinkedList<T2>* rear;
size_t length;
public:
MyQueue();
~MyQueue();
void Enquence(T2 value_);
void Dequence(T2& value_);
bool isEmpty();
void Clear();
size_t Length()
{
return this->length;
}
};
template<typename T2>
MyQueue<T2>::MyQueue()
{
front = nullptr;
rear = nullptr;
length = 0;
}
template<typename T2>
MyQueue<T2>::~MyQueue()
{
QLinkedList<T2>* garbage = nullptr;
while (front)
{
garbage = front;
front = front->next;
delete garbage;
garbage = nullptr;
std::cout << "析构了";
}
}
template<typename T2>
void MyQueue<T2>::Enquence(T2 value_)
{
if (isEmpty())
{
front = new QLinkedList<T2>(value_);
rear = front;
++length;
}
else
{
rear->next = new QLinkedList<T2>(value_);
rear = rear->next;
++length;
}
}
template<typename T2>
void MyQueue<T2>::Dequence(T2 & value_)
{
QLinkedList<T2> *temp = nullptr;
if (isEmpty())
{
std::cout << "The queue is empty.\n";
std::exit(1);
}
else
{
value_ = front->value;
temp = front;
front = front->next;
delete temp;
temp = nullptr;
--length;
}
}
template<typename T2>
bool MyQueue<T2>::isEmpty()
{
if (front == nullptr)
return true;
else
return false;
}
template<typename T2>
void MyQueue<T2>::Clear()
{
T2 value; // Dummy variable for dequeue
while (!isEmpty())
{
Dequence(value);
}
}