队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表
队列是一种先进先出(First In First out)的线性表
允许插入的一端称为队尾,允许删除的一端称为队头
特点:先进先出,后进后出
队列与其他的线性表不同的是,数据结构中的队列只能从队尾添加元素,在队头删除元素,这是由它逻辑结构决定的。
front:队头指针
rear:队尾指针
使用顺序表实现队列有一个缺点,队列满的时候,无法继续从队尾插入新元素,数组仍有空闲空间,造成空间浪费。
顺序队列实现较为简单,就是数组的下标操作
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 256
//顺序队列存储结构
typedef struct
{
int data[MaxSize]; //存放队列元素
int front, rear; //队头指针和队尾指针
}SqQueue;
//初始化
int InitQueue(SqQueue* Q)
{
Q->front = 0;
Q->rear = 0;
return 1;
}
//求顺序表长度
int QueueLength(SqQueue Q)
{
return Q.rear - Q.front;
}
//入队操作
int EnQueue(SqQueue* Q, int e)
{
if (Q->rear == MaxSize) //判断队列是否满
return 0;
Q->data[Q->rear] = e; //元素e赋值给队尾
Q->rear++; //队尾指针后移
return 1;
}
//出队操作
int DeQueue(SqQueue* Q, int* e)
{
if (Q->rear == Q->front) //队空
return 0;
*e = Q->data[Q->front]; //对头元素赋值给e
Q->front++; //对头指针后移
return 1;
}
int main(void)
{
int i, e, n; //e入队元素,n入队元素个数
SqQueue Q;
InitQueue(&Q); //初始化
printf("初始化成功\n");
printf("请输入入队元素个数\n");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("请输入第%d个元素值", i + 1);
scanf("%d", &e);
if (EnQueue(&Q, e))
printf("入队成功\n");
else printf("入队失败\n");
}
if (DeQueue(&Q, &e))
printf("\n元素%d出队\n", e);
else printf("出队失败\n");
printf("顺序队列长度为%d\n", QueueLength(Q));
return 0;
}