主页有其他数据结构内容(持续更新中)
代码:
#include<iostream>
using namespace std;
template <class T>
struct Node
{
T data; //数据域
Node<T>* next; //指针域
Node()
{
next = nullptr;
}
Node(T item, Node<T>* ptr = nullptr)
{
data = item;
next = ptr;
}
};
template <class T>
class LinkQueue
{
public:
LinkQueue(); //构造和析构
~LinkQueue();
LinkQueue(const LinkQueue& item); //拷贝构造函数
LinkQueue<T>& operator=(const LinkQueue& item); //重载赋值运算符
void push(const T& item); //入队操作
void pop(); //出队操作
bool empty()const; //判断队列是否为空
T top(); //返回队列头部元素
int size()const; // 返回队列长度
private:
Node<T>* front; //队头指针
Node<T>* rear; //队尾指针
int count;
};
template<class T>
LinkQueue<T>::LinkQueue() //构造函数
{
rear = front = nullptr;
this->count = 0;
}
template<class T>
LinkQueue<T>::~LinkQueue() //析构函数
{
while (!empty())
{
pop();
}
}
//入队操作
template<class T>
void LinkQueue<T>::push(const T& item)
{
Node<T>* temp = new Node<T>(item); //手动开辟空间
if (temp == nullptr)
{
cout << "Overflow!" << endl;
return;
}
if (rear == nullptr)
{
front = rear = temp;
}
else
{
rear->next = temp;
rear = temp;
}
this->count++;
}
//出队操作
template<class T>
void LinkQueue<T>::pop()
{
if (empty())
{
cout << "Underflow!" << endl;
return;
}
Node<T>* ptr = front;
front = front->next;
ptr = nullptr;
delete ptr;
if (this->count == 1){ // 这是最后一个结点出队
rear = nullptr;
}
this->count--;
}
//判断队列是否为空
template<class T>
bool LinkQueue<T>::empty()const
{
return count == 0;
}
template<class T>
T LinkQueue<T>::top() {
if (empty()) {
cout << "Underflow!" << endl;
}
else {
return front->data;
}
}
template<class T>
LinkQueue<T>::LinkQueue(const LinkQueue& item) //拷贝构造函数
{
Node<T>* original_front = item.front;
Node<T>* original_rear = item.rear;
Node<T>* new_copy;
if (original_front == nullptr && original_rear == nullptr)
{
front = rear = nullptr;
}
else
{
front = new_copy = new Node<T>(original_front->data);
rear = new Node<T>(original_rear->data);
while (original_front->next != nullptr)
{
original_front = original_front->next;
new_copy->next = new Node<T>(original_front->data);
new_copy = new_copy->next;
}
}
this->count = item.count;
}
template<class T>
LinkQueue<T>& LinkQueue<T>::operator=(const LinkQueue& item) //重载赋值运算符
{
Node<T>* original_front = item.front;
Node<T>* original_rear = item.rear;
Node<T>* new_copy;
if (original_front == nullptr && original_rear == nullptr)
{
front = rear = nullptr;
}
else
{
front = new_copy = new Node<T>(original_front->data);
rear = new Node<T>(original_rear->data);
while (original_front->next != nullptr)
{
original_front = original_front->next;
new_copy->next = new Node<T>(original_front->data);
new_copy = new_copy->next;
}
}
this->count = item.count;
return *this;
}
template<class T>
int LinkQueue<T>::size() const {
return this->count;
}
int main(){
LinkQueue<int> lq;
for (int i = 0; i < 10; ++i) {
lq.push(i);
}
cout << "队列的长度为:" << lq.size() << endl;
LinkQueue<int> copy_1 = lq;
while (!copy_1.empty()){
cout << copy_1.top() << "\t";
copy_1.pop();
}
cout << endl;
LinkQueue<int> copy_2 = lq;
while (!copy_2.empty()){
cout << copy_2.top() << "\t";
copy_2.pop();
}
return 0;
}