C++模板实现队列(1)

队列是一种先进先出(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;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/shuoyueqishilove/article/details/80483147