不牺牲存储单元的循环队列
题目
循环队列中设置一个标志flag,当frontrear且flag0时为队空,当frontrear且flag1时为队满,实现相应的入队和出队算法并验证。
浅析
循环队列的底层是什么?
循环队列的底层是数组,所以我们需要在程序的一开始设置一个常量const用于保存我们的队列的最大容量。
const int QueueSize=5;
传统的循环队列是如何实现的?
传统的循环队列采取浪费最后一个存储空间的方式来进行实现。
核心就是对队列的容量取余数。
代码
ECirQueue.h
/*
*不牺牲尾端空间的循环队列
*特殊的循环队列
*/
#include<iostream>
using namespace std;
const int QueueSize=5;
class ECirQueue
{
private:
/* data */
// int data[QueueSize]; //队列的底层依然为数组
// int front; //队头指针
// int rear; //队尾指针
public:
int data[QueueSize]; //队列的底层依然为数组
int front; //队头指针 假的队头
int rear; //队尾指针
int flag; //标志
ECirQueue();
~ECirQueue();
void EnQueue(int x); //进队
int DeQueue(); //出队,令队头元素出队
int GetHead(); //取队头元素 不删除
bool Empty(); //判断队列是否为空
void PrintQueue(); //遍历输出Queue 排队顺序
};
ECirQueue.cpp
#include"ECirQueue.h"
ECirQueue::ECirQueue()
{
rear=-1;
this->rear=this->front;
flag=0;
}
ECirQueue::~ECirQueue