好几天没有更新博客了今天我们一起来看一下环形队列。
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。
队列有两种实现方式分别是链表实现和数组实现。接下来我们来看环形队列的实现方法。
在程序设计上我们规定:环形队列最后一个元素不存储数据用来判断队列是否已满。
环形队列实际上并不存在,因为没有环形内存,我们只是将一个数组抽象成一个环形数组,将他的收尾指针都指向数组首元素的首地址。实际上的操作和数组的操作一样,只是要注意的是,当队列里没有数据时不能出队,当队列慢的时候不能入队。判断条件也很简单,就是头指针不能越过尾指针,尾指针不能超过数组界限。具体的实现请看代码和注释。
#pragma once
//queue.h
#include <stdio.h>
#include <stdlib.h>
#define QUEUENUM 5
typedef int DataType;
typedef struct {
DataType _data[QUEUENUM];
DataType * _head;
DataType * _tail;
size_t _size;
}deque;
DataType dequeFront(deque * qu);
void dequeInit(deque * qu);
void dequeEmpty(deque * qu);
int dequePush(deque * qu, DataType x);
int dequePop(deque * qu);
DataType dequeBack(deque * qu);
size_t dequeSize(deque * qu);
int dequeIsEmpty(deque * qu);
size_t dequeSize(deque * qu);
#include "queue.h"
//queue.c
void dequeInit(deque * qu)
{
//初始化环形队列
//将队列的头指针和尾指针同时指向数组开头(首元素的首地址)
qu->_head = qu->_tail = qu->_data;
qu->_size = 0;
}
void dequeEmpty(deque * qu)
{
//对列清空
//将对列收尾指针相等,因为清空之后会初始化将他们都指向数组头
qu->_head = qu->_tail;
qu->_size = 0;
}
int dequePush(deque * qu, DataType x)
{
//入队列
if ( (qu->_tail + 1 - qu->_data == QUEUENUM && qu->_head == qu->_data))
//入队列首先要判断队列是否已满,从队尾入。
//我们一般将队列的最后一个元素空下来用来判断对列是否已满,
{
printf("队列已满不能插入\n");
return -1;
}
*qu->_tail = x;
qu->_tail++;
/*if (qu->_tail - qu->_data == QUEUENUM)
{
qu->_tail = qu->_data;
}*/
qu->_size++;
return 0;
}
int dequePop(deque * qu)
{
if (dequeIsEmpty(qu))
{
//判断队列是否已满
return -1;
}
qu->_head++;
if (qu->_head - qu->_data == QUEUENUM)
{
//此种情况是当上一次出队头指针已将指到倒数第一个元素时紧接着再出队时,头指针
//就会指向设计程序时空着的最后一个元素,此时应该讲头指针重新指向首元素首地址。
qu->_head = qu->_data;
}
qu->_size--;
return 0;
}
DataType dequeFront(deque * qu)
{
return *qu->_head;
}
DataType dequeBack(deque * qu)
{
if (qu->_tail == qu->_data)
{
return qu->_data[QUEUENUM - 1];
}
return qu->_tail[-1];
}
int dequeIsEmpty(deque * qu)
{
return qu->_head == qu->_tail;
}
size_t dequeSize(deque * qu)
{
return qu->_size;
}
#include "queue.h"
int main()
{
deque test;
dequeInit(&test);
dequePush(&test, 1);
dequePush(&test, 2);
dequePush(&test, 3);
printf("%d\n", dequeFront(&test));
dequePop(&test);
printf("%d\n", dequeFront(&test));
dequePop(&test);
printf("%d\n", dequeFront(&test));
dequePush(&test, 4);
dequePush(&test, 5);
dequePop(&test);
printf("%d\n", dequeFront(&test));
dequePush(&test, 6);
dequePush(&test, 7);
dequePop(&test);
printf("%d\n", dequeFront(&test));
dequePop(&test);
printf("%d\n", dequeFront(&test));
system("pause");
return 0;
}