408考研——循环队列代码题常见套路总结
接上期,实际上循环队列和普通的顺序结构队列在各种实现上大差不差,唯一的不同就是在入队和出队的时候通过取模运算来规避假溢出,以及在判空时候略有不同。具体可以参考上期:
408考研——队列代码题常见套路总结-CSDN博客
一.定义与初始化
和之前普通的顺序队列一模一样的处理手段:
struct CycleQueue{int data[25];int front,rear; int length;//实际上即为所谓的size成员
}; InitQueue(CycleQueue &Q){for(int i=0;i<=24;i++)Q.data[i]=0;//起初均设为0 Q.front=Q.rear=0;Q.length=0;
}
打印的话也用之前的那种浮标即可:
void PrintQueue(CycleQueue &Q){for(int i=Q.front;i<=Q.rear-1;i++)//先进先出,整体上会平移,因此不能用长度,而得用头尾指针这样的游标 cout<<Q.data[i]<<" ";
}
二.入队
void Push(CycleQueue &Q,int value){if(Q.length==25)//队满就不能入队return;Q.data[Q.rear]=value;Q.rear=(Q.rear+1)%25;Q.length++;return;
}
三.出队
void Pop(CycleQueue &Q){Q.data[Q.front]=0;Q.front=(Q.front+1)%25;Q.length--;return;
}
入队和出队的时候,注意front指针和rear指针的不同~
另外还有两个公式需要注意一下:
- 队列长度:(Q.rear+Maxsize-Q.front)%Maxsize
- 队满条件:博主的实现方式是加入了表示队列长度的成员变量,但有时候题目不用这种办法,那么公式我们也要清楚:(Q.rear+1)%Maxsize==Q.front
最后给出测试用例:
int main() {CycleQueue Q;InitQueue(Q);for(int i=1;i<=5;i++)Push(Q,i);Pop(Q);PrintQueue(Q);return 0;
}