队列的链式存储
实现代码
#include <iostream>
using namespace std;
template <typename T>
struct QueueNode
{
T data;
QueueNode<T>* next;
};
template <typename T>
class LinkQueue
{
public:
LinkQueue();
~LinkQueue();
bool EnQueue(const T& e);
bool DeQueue(T& e);
bool GetQueue(T& e);
bool Empty();
int Queue();
void DisplayQueue();
void ClearQueue();
private:
QueueNode<T>* m_front;
QueueNode<T>* m_rear;
int m_size;
QueueNode<T>* m_head;
};
template <typename T>
LinkQueue<T>::LinkQueue()
{
QueueNode<T>* m_head = new QueueNode<T>;
m_front = nullptr;
m_rear = nullptr;
m_head->next = m_front;
m_size = 0;
}
template <typename T>
LinkQueue<T>::~LinkQueue()
{
T k;
while (m_size > 0)
{
DeQueue(k);
}
delete m_head;
}
template <typename T>
bool LinkQueue<T>::EnQueue(const T& e)
{
QueueNode<T>* p = new QueueNode<T>;
p->data = e;
if (m_size == 0)
{
m_rear = p;
m_front = p;
m_size++;
return true;
}
if (m_size == 1)
{
m_rear = p;
m_front->next = m_rear;
m_size++;
return true;
}
else
{
QueueNode<T>* q = m_rear;
q->next = p;
m_rear = p;
m_size++;
return true;
}
}
template <typename T>
bool LinkQueue<T>::DeQueue(T& e)
{
if (m_size == 0)
{
cout << "空队列无法出队!" << endl;
return false;
}
if (m_size == 1)
{
e = m_front->data;
QueueNode<T>* p = m_front;
delete p;
m_rear = nullptr;
m_front = nullptr;
m_size--;
return true;
}
else
{
e = m_front->data;
QueueNode<T>* p = m_front;
m_front = p->next;
delete p;
m_size--;
return true;
}
}
template <typename T>
bool LinkQueue<T>::GetQueue(T& e)
{
if (m_size == 0)
{
cout << "空队列无法获取队尾元素!" << endl;
return false;
}
else
{
e = m_front->data;
return true;
}
}
template <typename T>
bool LinkQueue<T>::Empty()
{
if (m_size == 0)
{
return true;
}
else
{
return false;
}
}
template <typename T>
int LinkQueue<T>::Queue()
{
return m_size;
}
template <typename T>
void LinkQueue<T>::DisplayQueue()
{
if (m_size == 0)
{
cout << "空队列,无法扫描!" << endl;
}
else
{
QueueNode<T>* p = m_front;
for (int i = 0; i < m_size; i++)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
}
template <typename T>
void LinkQueue<T>::ClearQueue()
{
T k;
while (m_size > 0)
{
DeQueue(k);
}
delete m_head;
}
int main()
{
LinkQueue<int> obj;
int k;
obj.DisplayQueue();
obj.DeQueue(k);
obj.EnQueue(1);
obj.EnQueue(2);
obj.EnQueue(3);
obj.EnQueue(4);
obj.EnQueue(5);
obj.DisplayQueue();
obj.DeQueue(k);
obj.DisplayQueue();
obj.DeQueue(k);
obj.DisplayQueue();
obj.EnQueue(10);
obj.DisplayQueue();
return 0;
}
循环队列
实现代码
#include <iostream>
using namespace std;
#define MaxSize 10
template <typename T>
class SeqQueue
{
public:
SeqQueue();
~SeqQueue();
bool EnSeqQueue(const T& e);
bool DeSeqQueue(T& e);
bool GetHead(T& e);
void ClearQueue();
void DisplayQueue();
int Queue();
bool IsEmpty();
bool IsFull();
private:
T* m_data;
int m_size;
int m_front;
int m_rear;
};
template <typename T>
SeqQueue<T>::SeqQueue()
{
m_data = new T[MaxSize];
m_front = 0;
m_rear = 0;
m_size = 0;
}
template <typename T>
SeqQueue<T>::~SeqQueue()
{
delete[] m_data;
}
template <typename T>
bool SeqQueue<T>::EnSeqQueue(const T& e)
{
if (IsFull() == true)
{
cout << "顺序队列已满,不能再进行入队列操作了!" << endl;
return false;
}
m_data[m_rear] = e;
m_rear = (m_rear + 1) % MaxSize;
m_size++;
return true;
}
template <typename T>
bool SeqQueue<T>::DeSeqQueue(T& e)
{
if (IsEmpty() == true)
{
cout << "空队列无法进行出队列操作!" << endl;
return false;
}
e = m_data[m_front];
m_front = (m_front + 1) % MaxSize;
m_size--;
return true;
}
template <typename T>
bool SeqQueue<T>::GetHead(T& e)
{
if (IsEmpty() == true)
{
cout << "空队列无法获取队头!" << endl;
return false;
}
e = m_data[m_front];
return true;
}
template <typename T>
bool SeqQueue<T>::IsEmpty()
{
if (m_size == 0)
{
return true;
}
else
{
return false;
}
}
template <typename T>
bool SeqQueue<T>::IsFull()
{
if (m_size == MaxSize)
{
return true;
}
else
{
return false;
}
}
template <typename T>
int SeqQueue<T>::Queue()
{
return m_size;
}
template <typename T>
void SeqQueue<T>::ClearQueue()
{
m_rear = 0;
m_front = 0;
}
template <typename T>
void SeqQueue<T>::DisplayQueue()
{
if (Queue() == 0)
{
cout << "空队列!" << endl;
}
else
{
for (int i = m_front; i !=m_rear; )
{
cout << m_data[i] << " ";
i = (i + 1) % MaxSize;
}
cout << endl;
}
}
int main()
{
SeqQueue<int> obj;
obj.DisplayQueue();
obj.EnSeqQueue(1);
obj.EnSeqQueue(2);
obj.EnSeqQueue(3);
obj.EnSeqQueue(4);
obj.EnSeqQueue(5);
obj.DisplayQueue();
int k;
obj.DeSeqQueue(k);
obj.DisplayQueue();
obj.DeSeqQueue(k);
obj.DisplayQueue();
obj.EnSeqQueue(1);
obj.EnSeqQueue(2);
obj.EnSeqQueue(15);
obj.EnSeqQueue(46);
obj.EnSeqQueue(120);
obj.EnSeqQueue(1111);
obj.DisplayQueue();
for (int i = 0; i <= 8; i++)
{
obj.DeSeqQueue(k);
obj.DisplayQueue();
}
return 0;
}