队列
原理:
<1> 队列是一种受限的线性结构
<2> 它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
队列的顺序存储
用数组来存储队列的元素,设立一个队首(front)用来表示队首元素的下标,设立一个队尾(rear)用来表示队尾元素的下标。
其结构体定义如下
typedef struct Queue{
dataType queue[MAX_SIZE];
int front;
int rear;
}SqQueue;
算法实现:
初始化顺序队列
bool initQueue(SqQueue*& Q) {
if (!Q) return false;
Q->front = Q->rear = 0;
return true;
}
判断队列元素存储空满情况
//判断队列是否为满
bool isQueueFull(SqQueue*& Q) {
if (!Q) return false;
if (Q->rear == MAX_SIZE) return true;
return false;
}
//判断队列是否为空
bool isQueueEmpty(SqQueue*& Q) {
if (!Q) return false;
if (Q->rear == Q->front) return true;
return false;
}
插入一个元素在队尾
bool QueueInsert(SqQueue*& Q, dataType data) {
if (!Q) return false;
if (isQueueFull(Q))
{
cout << "队列已满,无法插入数据!" << endl;
return false;
}
Q->queue[Q->rear++] = data;
return true;
}
队首出列
关于队首出列算法实现有两种思路
<1>删除front所指的元素,并将其后所有元素前移一个位置。
<2>直接将front所指的位置后移一位
其中第一种思路并不会使存储空间变小,但是所有元素前移浪费时间。
第二种思路会使存储空间表笑,但是不会移动元素。
这里实现第二种思路的代码
//出列队首元素,并将此元素存储在data里
bool QueueDelete(SqQueue*& Q,dataType &data) {
if (!Q) return false;
if (isQueueEmpty(Q))
{
cout << "队列已空,无法出数据!" << endl;
return false;
}
data = Q->queue[Q->front];
Q->front++;
return true;
}
遍历队列
void printQueue(SqQueue*& Q) {
if (!Q)
return;
if (isQueueEmpty(Q)) {
cout << "队列是空的!" << endl;
return;
}
for ( int i = Q->front;i < Q->rear;i++) {
cout << Q->queue[i] << endl;
}
return;
}