循环队列
定义
循环队列是逻辑上首尾相连的队列,实现方法有两种:链表法和数组法。链表法只要把尾部指针指向头结点就可以。这里详述数组法。
队列数组结构图
关键词
- front 队头,第一个元素
- rear 队尾,最后一个元素的下一个位置
数据结构
class Queue
{
public:
Queue(int size);
public:
bool empty();
bool full();
void push(int elem);
void pop();
int front();
int back();
private:
int *data;
int _front;
int rear;
int maxSize;
};
关键操作
- 判断空
front == rear,则队列空 - 判断满
(rear+1)%maxSize == front,则队列满 - 关于满的判断的两种方法
- 一种方法是设置一个字段,记录当前队列中的元素个数
- 另一种方法是队列中最后一个空间不存储,空留一个的目的是利于通过front与rear的相对位置判断队列的情况。若队列空间全部使用,则队列满的时候,rear == front ,这与队列空的条件相同。如果空出最后一个空间,队列满的判断条件就成上面的那样。
代码实现
Queue::Queue(int size):maxSize(size)
{
data = new int[maxSize];
_front = 0;
rear = 0;
}
bool Queue::empty()
{
return (_front == rear);
}
bool Queue::full()
{
return ( (rear+1) % maxSize == _front);
}
void Queue::push(int elem)
{
if(full())
{
return ;
}
data[rear] = elem;
rear = (rear+1)% maxSize;
}
void Queue::pop()
{
if(empty())
{
return ;
}
_front = (_front+1)%maxSize;
}
int Queue::front()
{
return data[_front];
}
int Queue::back()
{
return data[(rear-1+maxSize)%maxSize];
}
测试
int main()
{
Queue que(5);
que.push(1);
que.push(2);
que.push(3);
que.push(4);
que.push(5);
cout << que.front() << endl;
cout << que.back() << endl;
que.pop();
que.push(6);
cout << que.front() << endl;
cout << que.back() << endl;
return 0;
}