栈没有头结点,队列有头结点;队列FIFO,从队尾插入元素
#include<iostream>
using namespace std;
//20190929
//注意:栈没有头结点,队列有头结点;队列FIFO,从队尾插入元素
template<class T>
class QueueNode {
public:
T data;
QueueNode<T>*next;
QueueNode(const T&item = 0, QueueNode<T>*ptr = NULL) :data(item), next(ptr) {}
};
template<class T>
class Queue {
private:
QueueNode<T>*front;
QueueNode<T>*rear;
public:
Queue();
Queue(Queue<T>const&q);
Queue<T>&operator=(const Queue<T>&q);
~Queue();
void DestoryQueue();
void ClearQueue();
bool isEmpty();
int getSize();
void InsertElem(T elem);//插入元素elem成为队列的队尾元素
void DeleteElem();//队列中的首元素出队
void output();
T& Gethead();
};
template <class T>
Queue<T>::Queue()
{
this->front = this->rear = new QueueNode<T>;
if (this->front == NULL || this->rear == NULL)
{
exit(1);
}
}
template <class T>
void Queue<T>::InsertElem(T elem)
{
QueueNode<T>*p = new QueueNode<T>;
p->data = elem;
rear->next = p;
rear = p;
}
template<class T>
void Queue<T>::DeleteElem()
{
if (isEmpty())
{
cout << "NULL" << endl;
exit(1);
}
QueueNode<T>*temp = front->next->next;
cout << "队首元素" << front->next->data << "被删除" << endl;
delete front->next;
front->next = temp;
}
template <class T>
Queue<T>::Queue(const Queue<T> &q)
{
this->front = this->rear = new QueueNode<T>;
if (this->front == NULL || this->rear == NULL)
{
exit(1);
}
QueueNode<T>*temp = q.front->next;//temp用来遍历(队列有头结点)
while (temp != NULL)
{
InsertElem(temp->data);
temp = temp->next;
}
}
template <class T>
void Queue<T>::DestoryQueue()
{
QueueNode<T>*temp;
while (front)
{
temp = front->next;
delete front;
front = temp;
}
}
template <class T>
Queue<T>::~Queue()
{
DestoryQueue();
}
template <class T>
void Queue<T>::ClearQueue()
{
//清空队列(元素全置零)
QueueNode<T> *temp = front->next;//队列有头结点
while (temp != NULL)
{
temp->data = 0;
temp = temp->next;
}
}
template<class T>
bool Queue<T>::isEmpty()
{
//若队列为空返回true 否则返回false
if (front == rear)
return true;
return false;
}
template <class T>
int Queue<T>::getSize()
{
QueueNode<T> *temp = front->next;
int num = 0;
while (temp != NULL)
{
temp = temp->next;
num++;
}
return num;
}
template <class T>
void Queue<T>::output()
{
if (isEmpty())
{
cout << "NULL" << endl;
exit(1);
}
else
{
QueueNode<T> *temp = front->next;
while (temp != NULL)
{
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
}
template <class T>
T& Queue<T>::Gethead()
{
if (isEmpty())
{
cout << "NULL" << endl;
exit(1);
}
else
{
return front->next->data;
}
}
template <class T>
Queue<T>& Queue<T>::operator = (const Queue<T> &q)
{
DestoryQueue();//释放原有的内存(即delete所有的结点)
front = rear = new QueueNode<T>;
if (front == NULL || rear == NULL)
{
exit(1);
}
QueueNode<T> *temp = q.front->next;
while (temp != NULL)
{
InsertElem(temp->data);
temp = temp->next;
}
return *this;
}
int main() {
Queue<int>s1;
cout << "initial size:" <<s1.getSize()<< endl;
s1.InsertElem(1);
s1.InsertElem(2);
s1.InsertElem(3);
s1.InsertElem(4);
s1.InsertElem(5);
cout << "current size:" << s1.getSize() << endl;
cout << endl;
s1.output();
cout << endl;
s1.DeleteElem();
s1.DeleteElem();
s1.DeleteElem();
cout << endl;
cout << "current first elem:" << endl;
cout << s1.Gethead() << endl;
cout << endl;
cout << "after cleared:" << endl;
s1.ClearQueue();
s1.output();
cout << endl;
cout << "current size:" << s1.getSize() << endl;
cout << endl;
Queue<int>s2;
s2 = s1;
cout << "s2 output:" << endl;
s2.output();
system("pause");
return 0;
}
测试结果: