要求:
- 实现大小为10,数据类型为整型的静态循环队列
- 实现过程结合单例模式
思路:
- _front指向队头数据所在空间;_rear指向队尾数据所在空间的下一处
- 数据入队,_rear加1,并对10取模
- 数据出队,_front加1,并对10取模
- _front==_rear代表队空
- _front==(_rear+1)%10代表队满
示意图
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using std::cout;
using std::endl;
class Queue
{
public:
static Queue * getInstance() //单例模式实现要求
{
if(nullptr==_pInstance)
{
_pInstance=new Queue();
}
return _pInstance;
}
static void destroy() //单例模式实现要求
{
if(_pInstance)
{
delete _pInstance;
}
}
void print()
{
cout << "front= " << _front%10
<< " rear= " << _rear%10 << endl;
for(int i=0;i<10;i++)
{
cout << "data[" << i << "]= " << _data[i] <<endl;
}
}
/***元素入队***/
void push(int data);
/***元素出队***/
void pop();
/***读取队头元素***/
int front();
/***读取队尾元素***/
int back();
/***判断队列是否为空***/
bool empty();
/***判断队列是否为满***/
bool full();
private:
Queue()
: _front(0)
, _rear(0)
{
bzero(_data,sizeof(_data));
cout << "Queue()" << endl;
}
~Queue()
{
cout << "~Queue()" << endl;
}
private:
int _data[10];
int _front;
int _rear;
static Queue * _pInstance;
};
/***Queue类元素入队实现***/
void Queue::push(int data)
{
if(full()!=true)
{
_data[_rear]=data;
//_rear++;
_rear = (_rear+1)%10;
}else
{
cout << "error:Queue is full" << endl;
}
}
/***Queue类元素出队实现***/
void Queue::pop()
{
if(empty()!=true)
{
_data[_front]=0;
//_front++;
_front = (_front+1)%10;
}else
{
cout << "error:Queue is empty" << endl;
}
}
/***Queue类读取队头元素***/
int Queue::front()
{
if(_rear!=_front)
{
return _data[_front];
}else
{
cout << "error:Queue is empty" << endl;
return -1;
}
}
/***Queue类读取队尾元素***/
int Queue::back()
{
if(_rear!=_front)
{
return _data[(_rear-1)%10];
}else
{
cout << "error:Queue is empty" << endl;
return -1;
}
}
/***Queue类判断队空***/
bool Queue::empty()
{
if(_front==_rear)
{
return true;
}else
{
return false;
}
}
/***Queue类判断队满***/
bool Queue::full()
{
if((_rear+1)%10==_front)
{
return true;
}else
{
return false;
}
}
Queue * Queue::_pInstance=nullptr;
int main()
{
Queue *q=Queue::getInstance();
cout << "is empty " << q->empty() << endl;
cout << "is full " << q->full() << endl;
q->push(100);
q->push(99);
q->print();
cout << "q->front()= " << q->front() <<endl;
cout << "q->back()= " << q->back() <<endl;
cout << "is empty " << q->empty() << endl;
cout << "is full " << q->full() << endl;
cout << "-----------------" << endl;
q->pop();
q->print();
cout << "q->front()= " << q->front() <<endl;
cout << "is empty " << q->empty() << endl;
cout << "is full " << q->full() << endl;
cout << "-----------------" << endl;
q->pop();
q->print();
cout << "q->front()= " << q->front() <<endl;
cout << "is empty " << q->empty() << endl;
cout << "is full " << q->full() << endl;
cout << "-----------------" << endl;
for(int i=0;i<10;i++)
{
q->push(i);
}
q->print();
Queue::destroy();
return 0;
}
2021/1/18