1、顺序队列
由于顺序队列的底层使用的是数组实现,因此要预先申请一块足够大的内存空间初始化队列,此外,遵循队列“先进先出,后进后出(FIFO)”原则,我们还需要定义一个队头指针top,和队尾指针rear,如图一所示。
由于顺序队列初始状态没有存储任何元素,因此top指针和rear指针重合,且由于顺序队列底层通过数组实现,因此top和rear实际上是两个变量,它们的值分别是队头元素和队尾元素所在数组位置的下标。在图 1 的基础上,当有数据元素进队列时,对应的实现操作是将其存储在指针 rear 指向的数组位置,然后 rear+1;当需要队头元素出队时,仅需做top+1 操作。
例如,在图 1 基础上将 {1,2,3,4} 用顺序队列存储的实现操作如图 2 所示:
在图 2 基础上,顺序队列中数据出队列的实现过程如图 3 所示:
代码实现
#include <stdio.h>
/**
* @brief 入队
* @param *a:队列名, rear:队尾指针, data:插入数据
* @retval 队尾指针
*/
int enQuece(int *a,int rear,int data)
{
a[rear]=data;
rear++;
return rear;
}
/**
* @brief 出队
* @param *a:队列名, front:队头指针, rear:队尾指针
* @retval
*/
void deQuece(int *a,int front,int rear)
{
//front == rear ,说明队列空
while(front != rear)
{
printf("出队元素:%d\n",a[front]);
front++;
}
}
void main(void)
{
int a[100];
int front,rear;
front =rear = 0;
//入队
rear =enQuece(a,rear,1);
rear =enQuece(a,rear,2);
//出队
deQuece(a,front,rear);
}
2、循环队列
#include <stdio.h>
#define max 5//表示顺序表申请的空间大小
int enQueue(int *a,int front,int rear,int data){
//添加判断语句,如果rear超过max,则直接将其从a[0]重新开始存储,如果rear+1和front重合,则表示数组已满
if ((rear+1)%max==front) {
printf("空间已满");
return rear;
}
a[rear%max]=data;
rear++;
return rear;
}
int deQueue(int *a,int front,int rear){
//如果front==rear,表示队列为空
if(front==rear%max) {
printf("队列为空");
return front;
}
printf("%d ",a[front]);
//front不再直接 +1,而是+1后同max进行比较,如果=max,则直接跳转到 a[0]
front=(front+1)%max;
return front;
}
int main() {
int a[max];
int front,rear;
//设置队头指针和队尾指针,当队列中没有元素时,队头和队尾指向同一块地址
front=rear=0;
//入队
rear=enQueue(a,front,rear, 1);
rear=enQueue(a,front,rear, 2);
rear=enQueue(a,front,rear, 3);
rear=enQueue(a,front,rear, 4);
//出队
front=deQueue(a, front, rear);
//再入队
rear=enQueue(a,front,rear, 5);
//再出队
front=deQueue(a, front, rear);
//再入队
rear=enQueue(a,front,rear, 6);
//再出队
front=deQueue(a, front, rear);
front=deQueue(a, front, rear);
front=deQueue(a, front, rear);
front=deQueue(a, front, rear);
return 0;
}