这是笔试中遇到的一道题,要求实现循环队列,有入队,出队,判断是否为空,是否满等操作。
分析:
可以使用一个数组来存放循环队列,队头标记与队尾标记初始都为0,入队操作即队尾标记加1,若加1后相对循环等于队头则上溢;出队操作即队头标记加1,若加1后相对循环等于队尾则下溢;若队头标记等于队尾标记则为空;若队尾标记加1相对循环等于队头则为满。
具体实现如下:
template
class CirQueue
{
public:
enum {maxSize = 100};
CirQueue() {
front = rear = 0;
}
~CirQueue(){
}
void EnQueue(T x){ // 入队
if ((rear+1) % maxSize == front) throw "上溢";
rear = (rear+1) % maxSize;
data[rear] = x;
}
T DeQueue(){ // 出队
if (rear == front) throw "下溢";
front = (front+1) % maxSize;
return data[front];
}
bool IsEmpty(){
return (front == rear) ? true : false;
}
bool IsFull(){
return ((rear+1)%maxSize == front) ? true : false;
}
private:
int front, rear;
T data[maxSize];
};