数据结构之循环队列
- 一个误区
- 一点注意
- 代码
- ending
1. 一个误区
之前不采用STL实现双端队列时我记得我就是使用了循环队列。。。其实这是不规范的(虽然说使用很灵活,但我觉得还是应该分开来,避免弄混)。所以误区就是,循环队列是不允许弹出队尾或添加队首的 ,也就是说它是最传统的队列,严格符合 “先进先出,后进后出” 的特点!
2. 一点注意
判断队列是否满有两种解决方法:
- 少用一个单元,规定头(front)在尾(rear)后一位时就为满状态
- 设置一个标志,可以用bool 型,若满则为true,未满则false
3. 代码
#include<iostream>
using namespace std;
//--------------------循环队列实现------------------//
#define elemtype int
#define MAXSIZE 20
struct CirQue {
elemtype *base;
int front;
int rear;
};
// 初始化循环队列
void init(CirQue &Q) {
Q.base = new elemtype(MAXSIZE);
if (!Q.base)
exit(1);
Q.front = Q.rear = 0;
}
// 插入元素
void inQue(CirQue &Q, elemtype e) {
if (Q.rear + 1 == Q.front || (Q.rear == MAXSIZE - 1 && Q.front == 0))
return; //已满
if (Q.rear == MAXSIZE - 1) {
Q.base[Q.rear] = e; //插入
Q.rear = 0;
return;
}
Q.base[Q.rear++] = e;
}
// 弹出并返回元素
elemtype& popQue(CirQue &Q) {
if (Q.front == Q.rear)
exit(1);
if (Q.front == MAXSIZE - 1) {
int e = Q.base[Q.front];
Q.front = 0;
return e;
}
return Q.base[Q.front++];
}
// 打印队列
void PrintQue(const CirQue &Q) {
if (Q.front == Q.rear)
return;
else if (Q.front < Q.rear) {
for (int var = Q.front; var < Q.rear; ++var)
cout << Q.base[var] << endl;
return;
}
else {
for (int var = Q.front; var < MAXSIZE; ++var)
cout << Q.base[var] << endl;
for (int var = 0; var <= Q.front; ++var)
cout << Q.base[var] << endl;
return;
}
}
int main()
{
CirQue Q;
init(Q);
getchar();
return 0;
}
4. ending
晚安~~