【数据结构】队列的顺序存储实现-循环队列
//循环队列的实现
//队列向前删除,向后新增元素,实现先进先出,如排队
#include<iostream>
using namespace std;
typedef int ElementType;
#define MaxSize 10
#define ERROR -1
//定义循环队列,由一个数组,两个变量front和rear组成
typedef struct {
ElementType array[MaxSize];
int rear;
int front;
}Queue;
class t1
{
public:
void AddQ(Queue *,ElementType);
ElementType DeleteQ(Queue *, ElementType &);
void Initial(Queue *);
int VisitQ(Queue *);
};
void t1::AddQ(Queue *Q, ElementType X)//循环队列中由于队空和队满front和rear均相等,为了区分只用n-1个元素
{
if ((Q->rear + 1) % MaxSize == Q->front)
{
cout << "队列已满" << endl;
return;
}
else
{
Q->rear = (Q->rear + 1) % MaxSize;//新增元素时rear向后移动一位
Q->array[Q->rear] = X;
}
}
ElementType t1::DeleteQ(Queue *Q,ElementType &e)//向前删除队列中的一个元素,对于e的传参方式为传引用,仅能在c++中使用
{
if (Q->front == Q->rear)
{
cout << "队列为空" << endl;
return ERROR;
}
else
{
Q->front = (Q->front + 1) % MaxSize;//向队列的前部删除元素
e = Q->array[Q->front];
Q->array[Q->front] = 0;
return 0;
}
}
void t1::Initial(Queue *Q)//初始化队列,将rear和front的值设为-1,数组全为0
{
for (int i = 0;i < MaxSize;i++)
Q->array[i] = 0;
Q->front = -1;
Q->rear = -1;
}
int t1::VisitQ(Queue *Q)//遍历整个队列,输出不为0的元素
{
ElementType p;
if (Q->front == Q->rear)
{
cout << "空队列" << endl;
return ERROR;
}
else
{
cout << "队列中元素为:" << endl;
for (int i = 0;i < MaxSize;i++)
{
p = Q->array[i];
if (p)
cout << p << endl;
}
}
return 0;
}
void main()
{
t1 test1;
Queue Q1;
int count, count1,i, cell;
ElementType t;
test1.Initial(&Q1);//使用传址方式传递参数
cout << "请输入入队的元素个数:" << endl;
cin >> count;
cout << "请输入入队的元素:" << endl;
for (i = 0;i<count;i++)
{
cin >> cell;
test1.AddQ(&Q1, cell);
}
cout << "请输出队个数:" << endl;
cin >> count1;
cout << "出队元素为:" << endl;
for (i = 0;i<count1;i++)
{
test1.DeleteQ(&Q1, t);
cout << t << endl;
}
test1.VisitQ(&Q1);
}
结果:
分析:
(1)此队列为循环队列,即当尾部被占满,而头部为空,仞可以添加元素,此时将元素添加到头部位置
如代码:Q->rear = (Q->rear + 1) % MaxSize进行循环操作
(2)使用循环队列时需注意:
-
front和rear相等时,循环队列为空或为满,可以通过只使用n-1个位置,区分队列是否为满,如代码:(Q->rear + 1) % MaxSize == Q->front表示循环队列为满
-
需将front和rear的值设置为从-1开始
(3)队列为一端添加元素,另一端删除元素,即先进先出
(4)上面所示代码中,使用的传参方式为传址和传引用,适用于传递实参,具体传参方式见https://blog.csdn.net/zhangxiafll/article/details/82251459