判断循环队列是“空”还是“满”,有以下两种处理方法:
1》设置状态标志位以区别空还是满
2》少用一个元素,约定“队头front在队尾rear的下一个位置(指的是环的下一个位置)”作为“满”的标志
注意以下几点,循环队列迎刃而解:
1》求元素的个数:(rear - front + MAXSIZE) % MAXSIZE
2》front/rear指向逻辑的下一个空间 front =(front+1)%MAXSIZE rear = (rear+1)%MAXSIZE
3》判空:front == rear
4》判满:(rear+1+MAXSZIE) == front
代码如下:
#pragma once
#define MAXSIZE 5
#include<cstdlib>
#include<cassert>
#include<iostream>
using namespace std;
template<class T>
class Queue
{
private:
T *base;
int front;
int rear;
public:
explicit Queue();
virtual ~Queue();
bool push(const T& value);
bool pop();
T& top();
const T& top()const;
size_t size()const;
void clear();
void destory();
protected:
bool IsFull()const;
bool IsEmpty()const;
};
template<class T>
Queue<T>::~Queue()
{
destory();
}
template<class T>
void Queue<T>::destory()
{
if (base != NULL)
{
delete[] base;
base = NULL;
}
}
template<class T>
void Queue<T>::clear()
{
front = 0;
rear = 0;
}
template<class T>
size_t Queue<T>::size()const
{
return (rear - front + MAXSIZE) % MAXSIZE;
}
template<class T>
const T& Queue<T>::top()const
{
return base[front];
}
template<class T>
T& Queue<T>::top()
{
return base[front];
}
template<class T>
bool Queue<T>::IsFull()const
{
return (rear + 1) % MAXSIZE == front;//约定:front在rear的下一个位置表示队列已满
}
template<class T>
bool Queue<T>::IsEmpty()const
{
return front == rear;
}
template<class T>
Queue<T>::Queue()
{
T *tmp = new T[MAXSIZE];
assert(tmp != NULL);
base = tmp;
memset(base, 0, MAXSIZE*sizeof(T));
front = 0;
rear = 0;
}
template<class T>
bool Queue<T>::push(const T& value)
{
if (IsFull())
{
cout << "the queue is already full,can not push anymore!" << endl;
return false;
}
base[rear] = value;
rear = (rear + 1) % MAXSIZE;
return true;
}
template<class T>
bool Queue<T>::pop()
{
if (IsEmpty())
{
cout << "the queue is already empty,it can not pop anymore!" << endl;
return false;
}
front = (front + 1) % MAXSIZE;
return true;
}
参考文献:数据结构(C语言版) 严蔚敏 P63-P64
MSDN