循环队列sq中:
1. front(队头指针)指向实际队列元素的第一个元素的前一个位置,rear(队尾指针)指向实际队列元素的最后一个元素位置。(可根据需要自定义)
2. 循环队列中的满并非真正意义上的满,即并不是所有的位置上都存储有元素,而是front和rear之间仍然隔着一个空位。若不隔此空位,当sq->rear == sq->front时,是满?还是空?。
3. 初始时:sq->front = sq->rear = 0;(初始化)
队空条件:sq->front == sq->rear;(判空)
队满条件:(sq->rear+1)%MaxLen == sq->front;(判满)
完整代码如下:
//queue.cpp - 顺序循环队列的基本运算
#include <iostream>
#define MaxLen 20
//顺序队列的节点类型定义
typedef char ElementType;
typedef struct queue
{
ElementType data[MaxLen]; //顺序队列的存储方式 - 一维数组
int front, rear; //front - 头指针、rear - 尾指针
} queue;
//基本运算
void InitQueue(queue *sq); //初始化队列
bool EnQueue(queue *sq, ElementType x); //入队列
bool OutQueue(queue *sq, ElementType &x); //出队列
bool IsEmpty(queue *sq); //判空
bool IsFull(queue *sq); //判满
//具体实现
//初始化队列
void InitQueue(queue *sq)
{
sq->front = 0;
sq->rear = 0;
}
//判空
bool IsEmpty(queue *sq)
{
if(sq->front == sq->rear) //队列为空
return true;
else
return false;
}
//判满 - 这里的满不是真正意义上的满,最满的情况时,front和rear之间还隔有一个空位
bool IsFull(queue *sq)
{
if( (sq->rear+1)%MaxLen == sq->front ) //队列上溢出
return true;
else
return false;
}
//入队列
bool EnQueue(queue *sq, ElementType x)
{
if( IsFull(sq) ) //队列已满,无法再入队列
return false;
else
{
sq->rear = (sq->rear+1) % MaxLen;
sq->data[sq->rear] = x;
return true;
}
}
//出队列
bool OutQueue(queue *sq, ElementType &x)
{
if( IsEmpty(sq) ) //队列为空,无法出队列
return false;
else
{
sq->front = (sq->front+1) % MaxLen;
x = sq->data[sq->front];
return true;
}
}