队列的C++类模板实现

头文件:

 

/*****************************************************************************
 *                                    queue.h
 *
 * A simple queue implemented by C++ template class .
 *
 * Zhang Ming, 2009-10
 *****************************************************************************/


#ifndef QUEUE_H
#define QUEUE_H


#include <iostream>
#include <cstdlib>


using namespace std;


namespace itlab
{

    /**
     * Queue Node
     */
    template <typename Type>
    struct LinkNode
    {
        Type data;
        LinkNode<Type> *next;

        LinkNode() : next(NULL)
        { }
        LinkNode( const Type &x, LinkNode<Type> *p=NULL ) : data(x), next(p)
        { }
    };


    /**
     * Queue
     */
    template <typename Type>
    class Queue
    {

    public:

        Queue();
        ~Queue();

//        Queue( const Queue<Type> &rhs);
//        Queue<Type>& operator=( const Queue<Type> &rhs);

        inline bool isEmpty() const;
        inline void makeEmpty();

        inline void enqueue( const Type &x );
        inline void dequeue( Type &x );
        inline void getFront( Type &x );

    private:

        LinkNode<Type> *front,
                       *rear;

        inline void handleUnderflow();

    };


    #include <queue-impl.h>

}
// namespace itlab


#endif
// QUEUE_H

 

实现文件:

 

/*****************************************************************************
 *                               queue-impl.h
 *
 * Implementation for Queue class.
 *
 * Zhang Ming, 2009-10
 *****************************************************************************/


/**
 * constructors and destructor
 */
template <typename Type>
Queue<Type>::Queue() : front(NULL), rear(NULL)
{
}

template <typename Type>
Queue<Type>::~Queue()
{
    makeEmpty();
}


/**
 * If the queue is empty, return true.
 */
template <typename Type>
inline bool Queue<Type>::isEmpty() const
{
    return front == NULL;
}


/**
 * Make the queue empty.
 */
template <typename Type>
inline void Queue<Type>::makeEmpty()
{
    LinkNode<Type> *p;
	while( front != NULL )
	{
		p = front;
		front = front->next;
		delete p;
	}
}


/**
 * Enter an element into the queue.
 */
template <typename Type>
inline void Queue<Type>::enqueue( const Type &x )
{
    if( front == NULL )
	{
		front = rear = new LinkNode<Type>( x );
        if( !front )
        {
            cerr << "Out of memory!" << endl;
            exit( 1 );
        }
    }
	else
	{
		rear->next = new LinkNode<Type>( x );
		if( !rear )
		{
            cerr << "Out of memory!" << endl;
            exit( 1 );
        }
		rear = rear->next;
	}
}


/**
 * Pop an element from the queue.
 */
template <typename Type>
inline void Queue<Type>::dequeue( Type &x )
{
    if( !isEmpty() )
    {
        LinkNode<Type> *p = front;
        x = front->data;
        front = front->next;
        delete p;
    }
    else
        handleUnderflow();
}


/**
 * Get the front element of the queue.
 */
template <typename Type>
inline void Queue<Type>::getFront( Type &x )
{
    if( !isEmpty() )
        x = front->data;
    else
        handleUnderflow();
}


/**
 * Handle the error of get element from an empty queue.
 */
template <typename Type>
inline void Queue<Type>::handleUnderflow()
{
    cerr << "The queue is empty!" << endl << endl;
    exit( 1 );
}

 

测试文件:

 

/*****************************************************************************
 *                               queue_test.cpp
 *
 * Queue class testing.
 *
 * Zhang Ming, 2009-10
 *****************************************************************************/


#include <iostream>
#include <string>
#include <queue.h>


using namespace std;
using namespace itlab;


struct Student
{
    int     stuNum;
    string  stuName;
    string  department;

    Student( int number = 0, const string &name = "Tom&Jerry",
             const string &dpt = "Information" )
    : stuNum(number), stuName(name), department(dpt)
    { }

};


int main()
{
    Student stu;
    Queue<Student> q;

    q.enqueue( Student(11, "ZhangMing", "Information") );
    q.enqueue( Student(16, "HuZhaoJun") );
    q.enqueue( Student(11, "ZhangYuYang", "AutoControl") );
    q.enqueue( Student() );


    q.getFront( stu );
    cout << "  " << stu.stuNum << "\t" << stu.stuName << "\t"
         << stu.department << endl;

    cout << endl;
    while( !q.isEmpty() )
    {
        q.dequeue( stu );
        cout << "  " << stu.stuNum << "\t" << stu.stuName << "\t"
             << stu.department << endl;
    }
    cout << endl;

    q.getFront( stu );
    cout << "  " << stu.stuNum << "\t" << stu.stuName << "\t"
         << stu.department;

    cout << endl << endl;
    return 0;
}

 

转载于:https://my.oschina.net/zmjerry/blog/3656

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值