队列是一种先进先出(FIFO)的数据结构,常见的队列有链式队列和循环队列,链式队列结构简单,比较容易实现,但是效率不如循环队列;这里同时使用C++模板编程来实现这两种队列。
首先是链式队列,这里的链式队列采用双链表的结构,一头一尾分别使用一个指针。如下图所示:
之所以采用双链表结构是因为,这样做元素出队的时候比较好实现,直接根据head->prev就可以找到它的前驱节点,然后删掉原来的节点就可以。
节点定义为下面这样的数据结构:
template<typename T>
struct Node
{
T item;
Node* next;
Node* prev;
};
链式队列类的声明:
template<typename T>
class LQueue
{
private:
Node<T>* head;
Node<T>* rear;
unsigned int cnt;
public:
LQueue();//构造函数
~LQueue();//析构函数
void enqueue(T item);//入队
void dequeue();//出队
unsigned int size(){ return cnt; }//获取队列当前元素个数
bool isempty(){ return cnt == 0 ? true : false; }//判断队列是否为空
T getHead();//获取队头的元素
};
实现代码:
template<typename T>
LQueue<T>::LQueue()
{
cnt = 0;
Node<T>* anode = new Node<T>;
anode->next = NULL;
anode->prev = NULL;
head = anode;
rear = anode;
}
template<typename T>
LQueue<T>::~LQueue()
{
Node<T>* p = head;
for (int i = 0; i < cnt; i++)
{
dequeue();
}
}
template<typename T>
void LQueue<T>::enqueue(T item)
{
if (cnt == 0)
{
rear->item = item;
cnt++;
}
else
{
Node<T>* anode = new Node<T>;
anode->item = item;
anode->next = rear;
rear->prev = anode;
rear = anode;
rear->prev = NULL;
cnt++;
}
}
template<typename T>
void LQueue<T>::dequeue()
{
if (isempty())
{
cout << "Error: This LQueue is empty" << endl;
cout << "File Path =" << __FILE__ << endl;
cout << "Function Name =" << __FUNCTION__ << endl;
cout << "Line =" << __LINE__ << endl;
}
Node<T>* p = head;
head = p->prev;
delete p;
cnt--;
}
template<typename T>
T LQueue<T>::getHead()
{
return head->item;
}
选择顾客排队付款作为测试例子;
#include<iostream>
#include<string>
#include"myQueue.h"
using namespace std;
using std::string;
typedef struct
{
double amount;
string vipnum;
double discount;
}Customer_t;
int main()
{
LQueue<Customer_t> lq;
Customer_t temp;
cout<<"lq.size()="<<lq.size()<<endl;
for (int i = 0; i < 3; i++)
{
cout << "No." << i << endl;
cout << "vip number:";
cin >> temp.vipnum;
cout << "discount:";
cin >> temp.discount;
cout << "amount:";
cin >> temp.amount;
lq.enqueue(temp);
cout << "size=" << lq.size() << endl;
}
for (int i = 0; i < 3; i++)
{
temp = lq.getHead();
cout << "No." << i << " customer" << endl;
cout << "vip number:" << temp.vipnum << endl;
cout << "discount:" << temp.discount << endl;
cout << "amount:" << temp.amount << endl;
lq.dequeue();
cout << endl;
}
system("pause");
return 0;
}