Queue-C++

来源:互联网 发布:批八字算命软件 编辑:程序博客网 时间:2024/06/14 07:50
 /用链表实现一个简单队列
//队列特点:一种队首不断删除而队尾不断添加的数据结构
//今天选用链表而不选用数组,因为数组不太灵活,chinanetboy VC++6.0 调试并编译通过,主调用程序有完整的调用队列的功能实现
//------------------------------------------------------------------------
#include <iostream>
using namespace std;
//定义一个队列结构QList
struct QList
{
int nVar;
QList *nextPtr;
};

//定义一个顺序队列类Queue
class Queue
{
public:
Queue();                    //构造函数
~Queue();                   //析构函数
int QLength()const;         //队列长度
void Qprint()const;         //打印队列元素
void Enqueue(int value);    //队未添加元素
void Dequeue();             //队首删除元素

private:
QList *headPtr;             //队头
QList *tailPtr;             //队尾
int QLen;                   //队长度
};
//类函数的实现
//构造函数:初始化变量
Queue::Queue()                
{
    headPtr = tailPtr = NULL;
    QLen = 0;
}
//析构函数:用一个指针指向对队,删除队列中所有元素
Queue::~Queue()            
{
    QList *tempPtr;
    while (headPtr != NULL)
    {
    tempPtr = headPtr;
    headPtr = headPtr->nextPtr;
    delete tempPtr;
    }
}

//队未添加元素:
//在内存分配一个链表结点,输入的数据加进去,队尾指向新结点,队列长度+1
void Queue::Enqueue(int value)
{
        QList *tempPtr;                //建立一个结点指针变量tempPtr

        tempPtr = new QList;        //分配内存给tempPtr
        tempPtr->nVar = value;        //tempPtr结点的数据项nVar存入数据value
        tempPtr->nextPtr = NULL;    //tempPtr结点的链接项nextPtr指针设置为空

        if (headPtr == NULL)        //判断队首是否为空?
                headPtr = tempPtr;    //队首空,把队首指针指向新建立的结点tempPtr
        else
                tailPtr->nextPtr = tempPtr;
                                    //队列有数据,把队尾链接项指针指向新建立的结点tempPtr
        tailPtr = tempPtr;            //新建立的结点tempPtr的数据项更新队尾
        QLen++;                        //队列长度+1
}

//队首删除元素:
void Queue::Dequeue()
{
        QList *tempPtr;

        if (headPtr == NULL) {
                cout << "Queue already empty." << endl;
                return;
        }

        tempPtr = headPtr;
        headPtr = headPtr->nextPtr;
        delete tempPtr;
        QLen--;
}
//输出队列中所有元素
void Queue::Qprint()const
{
        QList *tempPtr;
        if (headPtr == NULL)
        {
           cout << "Queue is empty." << endl;
           return;
        }

        tempPtr = headPtr;
        while (tempPtr != NULL)
        {
                cout << tempPtr->nVar << "->";
                tempPtr = tempPtr->nextPtr;
        }
        cout << "NULL" << endl;
}
//计算队列个数
int Queue::QLength()const
{   return (QLen);}


//使用此类进行测试和演示
int main()
{
        Queue ATM;
        int choice;

        while (1) {
     cout<<"----------------------------------------/n";
     cout<<"***队列数据结构测试***/n";
     cout<<"1 尾部添加队列/n";
     cout<<"2 头部删除队列/n";
     cout<<"3 显示队列长度/n";
     cout<<"4 打印队列清单: /n";
     cout<<"0 退出试验/n";
     cout<<"***选择(0,1,2,3,4):/n";
     cout<<"----------------------------------------/n";
                cin >> choice;
                if (!choice)
                        break;
                switch (choice) {
                        case 1:
                                cout << "Enter an integer into queue: /n";
                                int value;
                                cin >> value;
                                ATM.Enqueue(value);
                                break;
                        case 2:
                                ATM.Dequeue();
                                break;
                        case 3:
                                int length ;
                                length= ATM.QLength();
                                cout << "length = " << length << endl;
                                break;
                        case 4:
                               ATM.Qprint();
                                break;
                        default:
                                cout << "Norecognize item." << endl;
                                break;
                }
        }

return 0;
}
原创粉丝点击