/*******************
 *      queue	   *
 * *****************/
#include <iostream>

using namespace std;
/*******************定义结构********************************************/
class Queue
{
    public:
	Queue(int capacity = 3);
	virtual ~Queue();
	bool en_queue(int v);//返回是否入队列成功
	bool de_queue(int *p = NULL);//返回出队是否成功,成功则返回p[变相返回]
	bool empty();//布尔型判断是否空队列
	bool full();
	int size();//当前队列大小
    private:
	int * pdata;
	int capacity;
	int first;
	int last;
};

/*******************构造函数********************************************/
Queue::Queue(int capacity)
{
    this->capacity = capacity;
    pdata = new int[capacity];
    first = 0;
    last = 0;
}

/*******************析构函数********************************************/
Queue::~Queue()
{
    if(NULL!=pdata)
    {
	delete [] pdata;
    }
    pdata = NULL;
}

/*******************入队函数********************************************/
bool Queue::en_queue(int v)
{
    if(full())
    {
	cout<<"queue is full\n";
	return false;
    }
    pdata[last++] = v;
//    last%= capacity;//循环赋值
    cout<<"en_queue "<<pdata[last-1]<<endl;
}

/*******************出队函数********************************************/
bool Queue::de_queue(int * p)
{
    if(empty())
    {
	cerr<<"queue is empty."<<endl;
	return false;
    }
    if(p!=NULL)
    {
	*p = pdata[last-1];//将出队的数值保存,变相返回
    }
    cout<<"de_queue "<<pdata[last-1]<<endl;
    last--;
    return true;
}

/*******************判空函数********************************************/
bool Queue::empty()
{
    if(first==last)
    {
	return true;
    }
    return false;
}

/*******************判满函数********************************************/
bool Queue::full()
{
    if((last+1)%capacity==first)
    {
	return true;
    }
    return false;
}

/*******************测试函数********************************************/
int main(int argc,char **argv)
{
    Queue s;
    int i = 0;
    s.en_queue(1);
    s.de_queue();
    s.en_queue(2);
    s.en_queue(3);
    s.en_queue(4);
    s.en_queue(5);
    s.en_queue(6);
    s.en_queue(7);

    cout<<endl<<endl;
    for(;i<7;i++)
    {
	s.de_queue();
    }

    return 0;
}