I.はじめに
キューはテールが追加の特性から、キューの先頭から削除されるので、キュー、達成するために添字すなわちデキューフロント++またはエンキュー後++方法を使用して、可動要素の位置を表すためにアレイを使用する場合、そこに反映するからです制限、リソーススペースの無駄。それを理解するには?
スケッチに示すように:
アイコンの説明:
配列キューが一杯である、ARR [0] = A1を、ARR [1] = a2と、ARR [2] = a3と、ARR [3] = a4と、この時のA5は、キューが確実に失敗しています。順番にA1、キューA2、その後、あなたが見ることができるARR [0]、[1]空にするに編曲位置であってもよいです。ただし、欠員の編曲があるもののので、[1]、A5はなく、スペースの無駄が生じキュー、に編曲要素は、[0]、尾からチームに入らなければならないからです。ここでは、最適化を行うことができます代わりに、要素の位置は、アレイに配置する必要があります計算する単純なアルゴリズムを使用しての、フロント++や++リアの位置は、もはや単純ではありません、実際には、この問題を解決するための円形キューの使用です。テール・ポインタは常に尾の位置の次の要素を指し、そのキューが常に満杯ではない、実際には、空の場所になりますので、判断の循環キューキュー満杯状態に注意してください、これは完全なを表します。
スケッチに示すように:
循環キューアルゴリズム
デキュー:フロント=(フロント+ 1)%maxSizeの
キュー:リア=(リア+ 1)%maxSizeの
空のキュー:フロント==リア
フルキュー:フロント==(リア+ 1)%maxSizeの
元素数:eleCount =(リア - フロント+ maxSizeの)%maxSizeの
第二に、アルゴリズム
#define MAXQSIZE 5 ///队列的最大长度 #define QUEUE_OVERFLOW -1 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int QElemType; typedef int Status; /// ----- 循环队列 ------- 队列的顺序存储结构 typedef struct { QElemType *base; //初始化的动态分配存储空间,存储元素 int front; //队头指针,若队列不空,指向队列头元素 int rear; //队尾指针,若队列不空,指向队列尾元素的下一个位置 }SqQueue; Status InitQueue(SqQueue &Q); //初始化一个空的循环队列 int QueueLength(SqQueue Q); //获取队元素个数 Status EnQueue(SqQueue &Q, QElemType e); //把元素e从队尾添加队列中 Status DeQueue(SqQueue &Q, QElemType &e); //获取队列的头元素,并取出元素值赋给e保存
三、代码
Status InitQueue(SqQueue &Q) { ///初始化一个空的循环队列 Q.base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType)); if (!Q.base) exit(QUEUE_OVERFLOW); //存储分配失败 Q.front = Q.rear = 0; cout<<"空队列创建成功"<<endl; return OK; } int QueueLength(SqQueue Q) { ///获取队元素个数 int eleCount = (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE; cout<<"队列元素有:"<<eleCount<<"个"<<endl; return eleCount; } Status EnQueue(SqQueue &Q, QElemType e){ ///把元素e从队尾添加队列中 if ((Q.rear + 1) % MAXQSIZE == Q.front) { cout<<"队列已满"<<endl; return ERROR; //队列已满 } Q.base[Q.rear] = e; Q.rear = (Q.rear + 1) % MAXQSIZE; cout<<"入队的元素:"<<e<<",front = "<<Q.front<<",rear = "<<Q.rear<<endl; return OK; } Status DeQueue(SqQueue &Q, QElemType &e){ ///获取队列的头元素,并取出元素值赋给e保存 if(Q.front == Q.rear){ cout<<"队列已空"<<endl; return ERROR; //队列已空 } e = Q.base[Q.front]; Q.front = (Q.front + 1) % MAXQSIZE; cout<<"出队的元素:"<<e<<",front = "<<Q.front<<",rear = "<<Q.rear<<endl; return OK; }
四、结果
测试:
int main() { //构建队列 SqQueue Q; if (InitQueue(Q)) { for (int i = 0; i < MAXQSIZE; ++i) { //入队列 EnQueue(Q, i + 1); } } //获取队列元素个数 QueueLength(Q); cout<<endl; for (int j = 0; j < 3; ++j) { //出队列 QElemType e; DeQueue(Q, e); //获取队列元素个数 QueueLength(Q); } return 0; }
打印:
/Users/xiayuanquan/CLionProjects/cycleQueue/cmake-build-debug/cycleQueue 空队列创建成功 入队的元素:1,front = 0,rear = 1 入队的元素:2,front = 0,rear = 2 入队的元素:3,front = 0,rear = 3 入队的元素:4,front = 0,rear = 4 队列已满 队列元素有:4个 出队的元素:1,front = 1,rear = 4 队列元素有:3个 出队的元素:2,front = 2,rear = 4 队列元素有:2个 出队的元素:3,front = 3,rear = 4 队列元素有:1个 进程已结束,退出代码 0