队列:
1.只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表
2.进行插入操作的一端称为队尾(入队列)
3.进行删除操作的一端称为队头(出队列)
4.队列具有先进先出(FIFO)的特性
由于顺序队列在操作上有诸多不便,(出队列时,要进行元素的搬移,效率低下,还会出现假溢出的问题)在此我们可以创建循环的顺序队列,即环形队列。
环形队列的实现:
构成:
typedef struct Queue
{
QDataType _array[MAX_SIZE];
int _Front; //队列的头
int _Back; //队列的尾
int count; //队列中有效元素个数
}Queue;
初始化:
void QueueInit(Queue* q)
{
assert(q);
q->_Front = q->_Back = 0;
q->count = 0;
}
入队列:
void QueuePush(Queue* q, QDataType data)
{
assert(q);
if (MAX_SIZE == q->count)
{
printf("队列满!\n");
return;
}
q->_array[q->_Back++] = data;
if (MAX_SIZE == q->_Back)
q->_Back = 0;
q->count++;
}
出队列:
void QueuePop(Queue* q)
{
assert(q);
if (Empty(q))
{
printf("队列空!\n");
return;
}
q->_Front++;
if (MAX_SIZE == q->_Front) //队头走到数组末尾,调整
q->_Front = 0;
q->count--;
}
判空:
int Empty(Queue* q)
{
return 0 == q->count;
}
队列大小:
int Size(Queue *q)
{
return q->count;
}
队头元素:
QDataType Front(Queue* q)
{
return q->_array[q->_Front];
}
队尾元素:
QDataType Back(Queue* q)
{
if (0 == q->_Back)
{
return q->_array[MAX_SIZE - 1];
}
else
{
return q->_array[q->_Back - 1];
}
}
完整代码:queue.h
#pragma once
#define MAX_SIZE 8
typedef int QDataType;
typedef struct Queue
{
QDataType _array[MAX_SIZE];
int _Front; //队列的头
int _Back; //队列的尾
int count; //队列中有效元素个数
}Queue;
void TestQueue();
void QueueInit(Queue *q); //初始化
void QueuePush(Queue *q, QDataType data); //入队列
void QueuePop(Queue *q); //出队列
int Empty(Queue *q); //判空
int Size(Queue *q); //队列大小
QDataType Front(Queue *q); //队头元素
QDataType Back(Queue *q); //队尾元素
void QueuePrint(Queue *q);
queue.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"queue.h"//环形队列
#include <stdio.h>
#include <assert.h>
void QueueInit(Queue* q)
{
assert(q);
q->_Front = q->_Back = 0;
q->count = 0;
}
void QueuePush(Queue* q, QDataType data)
{
assert(q);
if (MAX_SIZE == q->count)
{
printf("队列满!\n");
return;
}
q->_array[q->_Back++] = data;
if (MAX_SIZE == q->_Back)
q->_Back = 0;
q->count++;
}
void QueuePop(Queue* q)
{
assert(q);
if (Empty(q))
{
printf("队列空!\n");
return;
}
q->_Front++;
if (MAX_SIZE == q->_Front) //
q->_Front = 0;
q->count--;
}
int Empty(Queue* q)
{
return 0 == q->count;
}
int Size(Queue *q)
{
return q->count;
}
QDataType Front(Queue* q)
{
return q->_array[q->_Front];
}
QDataType Back(Queue* q)
{
if (0 == q->_Back)
{
return q->_array[MAX_SIZE - 1];
}
else
{
return q->_array[q->_Back - 1];
}
}
void QueuePrint(Queue *q)
{
int i = q->_Front;
for (; i < q->_Back; i++)
{
printf("%d--", q->_array[i]);
}
printf("\n");
}
void TestQueue()
{
Queue q;
QueueInit(&q);
QueuePush(&q, 1);
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
QueuePush(&q, 5);
QueuePush(&q, 6);
QueuePush(&q, 7);
QueuePrint(&q);
printf("size = %d\n", Size(&q));
printf("front = %d\n", Front(&q));
printf("back = %d\n", Back(&q));
QueuePop(&q);
QueuePop(&q);
QueuePop(&q);
QueuePop(&q);
QueuePrint(&q);
printf("size = %d\n", Size(&q));
printf("front = %d\n", Front(&q));
printf("back = %d\n", Back(&q));
QueuePush(&q, 8);
QueuePush(&q, 9);
QueuePush(&q, 10);
QueuePush(&q, 11);
QueuePush(&q, 12);
printf("size = %d\n", Size(&q));
printf("front = %d\n", Front(&q));
printf("back = %d\n", Back(&q));
}