欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++下环形队列的简单实现

程序员文章站 2022-03-10 17:31:07
c++下环形队列的简单实现 #include #include using namespace std; class...

c++下环形队列的简单实现

#include <iostream>
#include <string>
using namespace std;
 
class student
{
public:
    student(string name="o",int age=0)
    {
        sname=name;
        iage=age;
    }
    void print()
    {
        cout<<"name:"<<sname<<endl;
        cout<<"age:"<<iage<<endl;
        cout<<endl;
    }
private:
    string sname;
    int iage;
};
class myqueue
{
public:
    myqueue(int c);
    ~myqueue();
    void clearqueue();
    int queuelen();
    bool full();
    bool empty();
    void enterqueue(student element);
    void deletequeue(student &element);
    void traverse();
private:
    int icapacity;
    student *iqueue;//this pointer stands for the whole queue.
    int ilen;
    int head;
    int tail;
};
myqueue::myqueue(int c)
{
    icapacity=c;
    iqueue=new student[icapacity];
    ilen=0;
    head=0;
    tail=0;
    cout<<"this queue's capacity is "<<c<<endl;
}
myqueue::~myqueue()
{
    delete iqueue;
    iqueue=null;
}
void myqueue::clearqueue()
{
    ilen=0;
    head=0;
    tail=0;
}
int myqueue::queuelen()
{
    return ilen;
}
bool myqueue::full()
{
    return ilen == icapacity ? true: false;
}
bool myqueue::empty()
{
    return ilen == 0 ? true: false;
}
void myqueue::enterqueue(student element)//入队,从tail进
{
    if (full()==false)
    {
        iqueue[tail%icapacity]=element;
        //iqueue[tail]=element;
        tail++;
        //tail=tail%icapacity;
        ilen++;
    }
 
}
void myqueue::deletequeue(student &element)//出队,从head出,删除元素就是删除地址,该函数就是指删除首元素。
{
    if(empty()==false)
    {
        element=iqueue[head%icapacity];
        //element=iqueue[head];
        head++;
        //head=head%icapacity;
        ilen--;
    }
}
void myqueue::traverse()//遍历
{
    //cout<<iqueue[0]<<" "<<iqueue[1]<<" "<<iqueue[2]<<" "<<iqueue[3]<<endl;检验的确是循环使用的。
    for(int i=head;i<head+ilen;i++)
    {
 
        iqueue[i%icapacity].print();//ilen or icapacity???
        cout<<endl;
    }
}
 
int main()
{
    /* myqueue *p=new myqueue(4);
    p->enterqueue(10);
    p->enterqueue(12);
    p->enterqueue(14);
    p->enterqueue(16);
    int e=0;//任意赋初值
    p->deletequeue(e);
    cout<<e<<endl;//返回删除的元素的值
    cout<<endl;
    p->traverse();
    p->enterqueue(20);
    p->traverse();*/
    myqueue *p=new myqueue(4);
    student s1("a",1);
    student s2("b",2);
    student s3("c",3);
    student s4("d",4);
    p->enterqueue(s1);
    p->enterqueue(s2);
    p->enterqueue(s3);
    p->enterqueue(s4);
    p->traverse();
    delete []p;
    p=null;
    return 0;
}

队列,fifo;分为普通队列和环形队列。

它只允许在队头进行删除操作,而在队尾进行插入操作。

普通队列效率低,速度慢,且容易造成内存空间浪费。

相较于普通队列,环形队列(循环队列)则很好的解决了这些问题。