循环队列利用顺序队列的第2种出队方式:
1.使用队头(front)向后移动,而不是通过将整个队列向前移动,大大提高了出队的效率。
2.使用循环队列,解决了第2种出队方式浪费存储空间的问题。
3.也就是说,循环队列出队效率高,存储空间利用率高。
空队列:
循环队列:
插入元素:
满队列:
方法:
1.利用取模
2.判断队列空:SQ->front==SQ->rear;
3.判断队列满:(SQ->rear+1)%MAX_SIZE==SQ->front;
4.循环队列入队,队尾循环后移:SQ->rear=(SQ->rear+1)%MAX_SIZE;
5.循环队列出队,队头循环后移:SQ->front=(SQ->front+1)%MAX_SIZE;
6.元素个数:
if(SQ->rear >= SQ->front) return SQ->rear - SQ->front;
if(SQ->rear < SQ->front) return SQ->rear - SQ->front + MAX_SIZE;
//合并为:
return (SQ->rear - SQ->front + MAX_SIZE) % MAX_SIZE;
代码:
//利用取模方法实现循环队列
#include <iostream>
#define MAX_SIZE 5
using namespace std;
typedef int DataType;
typedef struct t
{
DataType data[MAX_SIZE];
int front;
int rear;
}SeqQueue;
int initQueue(SeqQueue* &SQ)
{
SQ = new SeqQueue;
if (!SQ) return 0;
SQ->front = SQ->rear = 0;
return 1;
}
//判断队列是否为满,利用取余方法实现循环
int isFull(SeqQueue* &SQ)
{
if (!SQ) return 0;
if ((SQ->rear + 1) % MAX_SIZE == SQ->front)
{
cout << "队列已满" << endl;
return 1;
}
return 0;
}
//判断是否为空
int isEmpty(SeqQueue* &SQ)
{
if (!SQ || SQ->front==SQ->rear)
{
cout << "队列为空" << endl;
return 1;
}
return 0;
}
//入队,队列是否为满
int enterQueue(SeqQueue* &SQ, DataType data)
{
if (!SQ)return 0;
if (isFull(SQ))return 0;
SQ->data[SQ->rear] = data;
SQ->rear = (SQ->rear + 1) % MAX_SIZE;
return 1;
}
//打印
void printQueue(SeqQueue* &SQ)
{
if (isEmpty(SQ)) return;
int i = SQ->front;
while (i!=SQ->rear)
{
cout << SQ->data[i] << "\t";
i = (i + 1) % MAX_SIZE;
}
cout << endl;
}
//出队
int deleteQueue(SeqQueue*& SQ, DataType& data)
{
if (isEmpty(SQ)) return 0;
data = SQ->data[SQ->front];
SQ->front = (SQ->front + 1) % MAX_SIZE;
return 1;
}
//求队列存储数数据,个数
int getLength(SeqQueue*& SQ)
{
// if (SQ->front > SQ->rear) return SQ->rear + MAX_SIZE - SQ->front;
// if (SQ->front <= SQ->rear) return SQ->rear - SQ->front;
//合并
return (SQ->rear - SQ->front + MAX_SIZE) % MAX_SIZE;
}
void clearQueue(SeqQueue*& SQ)
{
if (!SQ) return;
SQ->front = SQ->rear = 0;
}
int main()
{
SeqQueue* SQ = NULL;
DataType data = 0;
if (initQueue(SQ)) cout << "循环链表初始化成功!" << endl;
else cout << "循环队列初始化失败!" << endl;
for (int i = 0; i < 10; i++)
{
if (enterQueue(SQ, i))cout << i << "插入成功!" << endl;
}
cout << "元素个数为:" << getLength(SQ) << endl;
printQueue(SQ);
if (deleteQueue(SQ, data))cout << data << "成功出队" << endl;
cout << "元素个数为:" << getLength(SQ) << endl;
printQueue(SQ);
clearQueue(SQ);
system("pause");
return 0;
}