顺序队的基本操作(C++完整代码)

来源:互联网 发布:知乎如何添加图片 编辑:程序博客网 时间:2024/06/02 01:29

这里是用C++编写的队的基本操作,包括入队、不带参出队、带参出队和vector顺序容器的基本操作。
可与c语言的代码对照看,便于理解。
(C语言的代码在这里:
http://blog.csdn.net/fengyanglian/article/details/50010601)

以下是C++的完整源代码:

//c语言中,我们是建立结构体,其中包含front,back,data[MAXSIZE]含有MAXSIZE个元素的数组//这里的c++,我们用类成员标识这几个变量,这里的类中,我们包含有私有成员front,back,size,Array含size个元素的容器#include<iostream>#include<vector>using namespace std;template <typename Object> class Queue      //类模板{    public:        Queue(int capacity = 5) : front(0), back(-1), size(0), Array(capacity) { }        bool isEmpty()      //判断是否为空        {            return size == 0;        }        bool isFull()       //判断队是否已满        {            return size == Array.size();        }        void EnQueue(Object x)      //插入元素到队中        {            if(isFull())        //若队已满,将其扩大一倍,并复制愿数据到新容器中,                                //是复制到后半部分,并设置front,back            {                Array.resize(Array.size() * 2);                //假如有5个位置(队已满,只有两种情况):                //(A)当队列为1(首) 2 3 4 5(尾),扩容后应为1 2 3 4 5 1(首) 2 3 4 5(尾),首尾均移动,下次入队从开始处,首尾间为有效位置                //(B)当队列为1 2(尾) 3(首) 4 5,扩容后应为1 2(尾) 3 4 5 1 2 3(首) 4 5,队首移动队尾不动,首尾间为无效位置                for(int i = front; i < Array.size() / 2; i++)                    Array[i + Array.size() / 2] = Array[i];                front += Array.size() / 2;                if(back == Array.size()/2 - 1)                    back += Array.size() / 2;            }            //若队未满,正常操作,size加,back移到下一个位置,入队            size++;            back = succ(back);            Array[back] =x;        }        //不带返回值的出队        void DeQueue()        {            if(isEmpty())            {                cout << "Empty!" << endl;                return;            }            else            {                size--;                front = succ(front);            }        }        //带返回值的出队        Object DeQueueObject()        {            if(isEmpty())            {                cout << "Empty!" << endl;                return NULL;            }            else            {                size--;                Object obj = Array[front];                front = succ(front);                return obj;            }                   }        //清空(队还存在,只是将其中元素清零)        void makeEmpty()        {            front = 0;            back = -1;            size = 0;            for(int i = 0; i < Array.size(); i++)                Array[i] = Object();        //将所有元素设为其类型的初始值        }        void Printf()       //用于显示队中元素        {            cout << "The queue is: ";            for(int i = front; i != succ(back); i = succ(i))        //从front开始,到back结束                                                                    //(back时也要输出),所以到succ(back)            {                cout << Array[i] << " ";            }            cout << endl;        }    private:                int front;      //与c中结构体里的变量一致        int back;        int size;        vector<Object> Array;       //用顺序容器vector存储队中元素        int succ(int index)     //取当前位置的下一个位置(front下一个位置:出桟后位置。back下一个位置:入栈位置)                                //正常情况下,直接取后一个。若当前位置在队末端,则折回去,取第一个位置。        {            if(++index == Array.size())                index=0;            return index;        }};int main(){    Queue<int> q;    q.EnQueue(1);    q.EnQueue(2);    q.EnQueue(3);    q.EnQueue(4);    q.EnQueue(5);    q.EnQueue(6);    q.EnQueue(7);    q.EnQueue(8);       //将8个数据入队    q.Printf();     //输出队中元素    cout << "The element is been deleted." << endl;     //不带参的删除,并输出队    q.DeQueue();    q.Printf();    cout << "The delete element is: "       //带参的删除,输出删除元素,并输出当前队         << q.DeQueueObject() << endl;    q.Printf();    return 0;}
0 0