#include<stdio.h>
#include<malloc.h> //包含了malloc函数
int flag = 0;
/*
*循环队列,用数组实现
*/
//队列结构体定义
typedef struct Queue
{
int * pBase; //用于动态分配内存,pBase保存数组的首地址
int front; //指向头结点
int rear; //指向最后一个元素的下一结点
} QUEUE;
//函数声明
void initQueue(QUEUE * pQueue); //队列初始化的函数
bool isEmpty(QUEUE * pQueue); //判断队列是否为空的函数
bool isFull(QUEUE * pQueue); //判断队列是否满的函数
bool enQueue(QUEUE * pQueue, int value); //入队的函数
bool outQueue(QUEUE * pQueue, int * pValue); //出队的函数,同时保存出队的元素
void traverseQueue(QUEUE * pQueue); //遍历队列的函数
void clearQueue(QUEUE * pQueue);
//destroy Queue
void destroyQueue(QUEUE * pQueue);
/*
*主程序
*/
int main(void)
{
int value; //用于保存出队的元素
//创建队列对象
QUEUE queue;
//调用初始化队列的函数
initQueue(&queue);
//调用入队函数
enQueue(&queue, 1);
enQueue(&queue, 2);
enQueue(&queue, 3);
enQueue(&queue, 4);
enQueue(&queue, 5);
enQueue(&queue, 6);
enQueue(&queue, 7);
enQueue(&queue, 8);
//调用遍历队列的函数
traverseQueue(&queue);
//调用出队函数
if(outQueue(&queue, &value))
{
printf("出队一次,元素为:%d\n", value);
}
traverseQueue(&queue);
if(outQueue(&queue, &value))
{
printf("出队一次,元素为:%d\n", value);
}
traverseQueue(&queue);
clearQueue(&queue);
traverseQueue(&queue);
destroyQueue(&queue);
getchar();
return 0;
}
/*
*初始化函数的实现
*/
void initQueue(QUEUE * pQueue)
{
//分配内存 数组大小为6
pQueue->pBase = (int *)malloc(sizeof(int) * 6); //分配6个int型所占的空间
pQueue->front = 0; //初始化时,front和rear值均为0
pQueue->rear = 0;
return;
}
/*
*入队函数的实现
*/
bool enQueue(QUEUE * pQueue, int value)
{
if(isFull(pQueue))
{
printf("%d",pQueue->rear);
if(flag == 0){
pQueue->pBase[pQueue->rear] = value;
}
printf("队列已满,不能再插入元素了!\n");
flag = 1;
return false;
}
else
{
int temp = pQueue->rear;
//向队列中添加新元素 每一次加在队尾
pQueue->pBase[pQueue->rear] = value;
//将rear赋予新的合适的值
pQueue->rear = (pQueue->rear+1) % 6;
return true;
}
}
/*
*出队函数的实现
*/
bool outQueue(QUEUE * pQueue, int * pValue)
{
//如果队列为空,则返回false
if(isEmpty(pQueue))
{
printf("队列为空,出队失败!\n");
return false;
}
else
{
*pValue = pQueue->pBase[pQueue->front]; //先进先出
pQueue->front = (pQueue->front+1) % 6; //移到下一位置
return true;
}
}
/*
*遍历队列的函数实现
*/
void traverseQueue(QUEUE * pQueue)
{
int i = pQueue->front; //从头开始遍历
printf("遍历队列:\n");
while(i != pQueue->rear) //如果没有到达rear位置,就循环
{
printf("%d ", pQueue->pBase[i]);
i = (i+1) % 6; //移到下一位置
}
printf("%d\n",pQueue->pBase[i]);
return;
}
/*
*判断队列是否满的函数的实现
*/
bool isFull(QUEUE * pQueue)
{
if((pQueue->rear+1) % 6 == pQueue->front) //队列满
return true;
else
return false;
}
/*
*判断队列是否为空函数的实现
*/
bool isEmpty(QUEUE * pQueue)
{
if(pQueue->front == pQueue->rear)
return true;
else
return false;
}
void clearQueue(QUEUE * pQueue){
///这个数组的话可能只好置为0值这样子
int i = pQueue->front;
while(i != pQueue->rear) //如果没有到达rear位置,就循环
{
pQueue->pBase[i] = 0;
i = (i+1) % 6; //移到下一位置
}
pQueue->pBase[i] = 0;
}
/*
销毁队列
*/
void destroyQueue(QUEUE * pQueue){
// QUEUE * tempQ = &pQueue;
if(pQueue!=NULL){
free(pQueue->pBase);
}
if(pQueue->pBase[0]!= 0){
printf("队列成功销毁!\n");
pQueue = NULL;
pQueue = NULL;
}
else{
printf("%d\n",pQueue->pBase[0]);
// printf("队列销毁失败!\n");
}
/* if((pQueue->)){
printf("销毁失败!\n");
exit(0);
}
else{
printf("队列成功销毁!\n");
pQueue = NULL;
}*/
}
注:本人不是很清楚为什么会有双向循环队列这个东西,但是具体在某些方面肯定更加方便 比如可以反向遍历 像两个方向搜索等。
循环链表
最新推荐文章于 2022-12-26 21:17:59 发布