您的位置:首页 > 编程语言 > C语言/C++

顺序循环队列C++实现2倍扩容版本

2018-02-16 15:25 465 查看
class CircleQueue
{
public:
CircleQueue(int size = 20);
~CircleQueue();
CircleQueue(const CircleQueue &src);
void operator =(const CircleQueue &src);
void push(int val);
void pop();
int front();
int back();
bool empty();
bool full();
private:
int *_pQue;
int _size;
int _front;
int _rear;
void resize();
};

CircleQueue::CircleQueue(int size)
{
_pQue = new int [size];
memset(_pQue, 0, sizeof(int)*size);
_size = size;
_front = 0;
_rear = 0;
}
CircleQueue::~CircleQueue()
{
delete[] _pQue;
_pQue = NULL;
}
CircleQueue::CircleQueue(const CircleQueue &src)
{
_pQue = new int[src._size];
memset(_pQue, 0, sizeof(int)*src._size);
_size = src._size;
_front = src._front;
_rear = src._rear;
}
void CircleQueue::operator=(const CircleQueue &src)
{
if (this == &src)
return;

delete []_pQue;//通用做法,如果内存容量足够,直接使用

_pQue = new int[src._size];
memset(_pQue, 0, sizeof(int)*src._size);
_size = src._size;
_front = src._front;
_rear = src._rear;
for (int i = _front; i < _rear;i= (i + 1)% _size)
{
_pQue[i] = src._pQue[i];
}
}
void CircleQueue::push(int val)
{
if (full())
resize();
_pQue[_rear] = val;
_rear = (_rear + 1) % _size;
}
void CircleQueue::pop()
{
if (empty())
return;
_front = (_front + 1) % _size;
}
int CircleQueue::front()
{
return _pQue[_front];
}
int CircleQueue::back()
{
return _pQue[_rear - 1];
}
bool CircleQueue::empty()
{
return _rear == _front;
}
bool CircleQueue::full()
{
return (_rear + 1) % _size == _front;//牺牲一元素空间判满
}
void CircleQueue::resize()
{
int *tmp = new int [_size * 2];
int count = 0;
memset(tmp,0 , sizeof(int)*_size *2);
for (int i = _front; i < _rear; i = (i + 1) % _size)
{
tmp[count++] = _pQue[i];
}
_front = 0;
_rear = count;
_size *= 2;
delete[]_pQue;
_pQue = tmp;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: