文章目录
循环队列
1. 回顾队列的知识
- 队列是先进先出
- 我们用的是一组地址连续的储存单元依次存放从对头到队尾的元素。
- 设了两个指针分别指向队头和队尾。
- 插入:尾指针增1,删除:头指针增1
- 头指针始终指向队头元素,尾指针始终指向队尾元素的下一个位置。
- 如图:
***
2. 循环队列定义
- 假设,队列空间大小为6
- 当队列处于(d)状态时,Q.front == Q.rear,判为队满。
- 浪费了很多空间
- 由此产生了循环队列
- 对空:front = rear
- 队满:(rear+1)%M == front ,M为分配的大小
3. C语言下的循环队列
3.1 定义及初始化
#define MAX_QSIZE = 100
typedef struct {
QElemType *base;
int front;
int rear;
}SqCircleQueue;
Status InitSCQ(SqCircleQueue &Q) {
// 构造一个空队列
Q.base = (QElemType*)malloc(MAX_QSIZE*sizeof(QElemType));
if(!Q.base) return -2;
Q.front = Q.rear = 0;
return OK;
} // of InitSCQ
3.2 返回循环队列中的元素个数
int SCQLength(SqCircleQueue &Q) {
// 返回循环队列中的元素个数
return (Q.rear-Q.front+MAX_QSIZE)%MAX_QSIZE;
} // of SCQLength
3.3 入队
Status EnSCQ(SqCircleQueue &Q,QElemType e) {
// 入队
if((Q.rear+1)%MAX_QSIZE == Q.front) return ERROR; // 队满
Q.base[Q.rear] = e;
Q.rear = (Q.rear+1)%MAX_QSIZE;
return OK;
} // of EnSCQ
3.4 出队
Status DeSCQ(SqCircleQueue &Q, QElemType &e) {
//出队
if(Q.front == Q.rear) return ERROR; // 队空
e = Q.base[Q.front];
Q.front = (Q.front+1)%MAX_QSIZE;
return OK;
} // of DeSCQ
4. Java语言下的循环队列
4.1 构造一个循环队列
/**
* 循环队列的大小
*/
public static final int SIZE = 100;
/** 工作空间 */
int[] data;
/** 对头 */
int head;
/** 队尾 */
int tail;
/** 构造一个循环队列 */