首页 > 代码库 > 线性结构之循环队列实现
线性结构之循环队列实现
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define maxsize 6
/*
循环队列是采用数组实现,传统的数组解决造成浪费大量内存。改进版既是循环数组来解决。
*/
typedef struct queue
{
int *pBase;
int front;
int rear;
}Queue;
void DeQueue(Queue *,int *val);
void EnQueue(Queue *,int);
void initQueue(Queue *);
bool queueFull(Queue *);
bool queueEmpty(Queue *);
void main()
{
Queue queue;
//初始化队列
initQueue(&queue);
//入队
EnQueue(&queue,2);
EnQueue(&queue,3);
EnQueue(&queue,5);
EnQueue(&queue,4);
//出队
int val;
DeQueue(&queue,&val);
DeQueue(&queue,&val);
DeQueue(&queue,&val);
DeQueue(&queue,&val);
}
void initQueue(Queue *queue)
{
//头坐标指向第一个元素,为坐标指向当前元素的下一个。
queue->front=0;
queue->rear=0;
queue->pBase=(int *)malloc(sizeof(int)*6);
if(queue->pBase==NULL)
{
printf("内存分配失败");
exit(-1);
}
}
void EnQueue(Queue *queue,int val)
{
if(queueFull(queue))
{
printf("当前队列已经满了,无法再入队了");
return;
}
queue->pBase[queue->rear]=val;
queue->rear=(queue->rear+1)%maxsize;// 假设从数组5开始,入完了之后,还可以在从0开始入。
}
void DeQueue(Queue *queue,int *val)
{
if(queueEmpty(queue))
{
printf("当前队列已经为空了,无法再出队了");
return;
}
*val=queue->pBase[queue->front];
queue->front=(queue->front+1)%maxsize;// 假设从数组5开始,入完了之后,还可以在从0开始入。
printf("%d ",*val);
printf("\n");
}
bool queueFull(Queue *queue)
{
if((queue->rear+1)%maxsize==queue->front)
return true;
else
return false;
}
bool queueEmpty(Queue *queue)
{
if(queue->rear==queue->front)
return true;
else
return false;
}
//一个循环数组如果rear==front,无法判断其是否为空,还是满?
/*怎么办呢?让一个空间不存粗元素,空间为6的数组,满的时候,只能存5个。
另外还有一个问题,循环数组,怎么来判断其是否为满呢?
循环数组怎么让他们从6下面又变成0,方法有的是数数,0,1,2,3,4,5,6,7,8,8,10,11,10,11,可以这样认为吗
0,1,2,3,4,5,6第一个数完之后,在重新数0,1,2,3,4,5,,不就可以了吗,不就数完了吗。重新数,不就是求余操作。
那怎么判断为满的情况呢,还是数数,有一个不存,只要保证当前尾坐标的下个位置和头坐标是一个位置,不就可以了吗!
本文出自 “简答生活” 博客,转载请与作者联系!
线性结构之循环队列实现