循环队列 ~ 程序实现一
本篇博客基于 温故而知新 -> 数据结构 -> 线性表 ->队列 博客中的理论知识,然后利用 C
中的 结构体 对数据结构中的 循环队列 进行代码实现!
其中涉及了循环队列的 增(入队)删(出队)查(队头与队尾元素)改(没写(~ ̄▽ ̄)~),判空,打印等操作!并附带了实例以及对应的运行结果!
具体内容如下
(1)newCQueue.h
#ifndef __NEWCQUEUE_H_
#define __NEWCQUEUE_H_
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct{
//队头元素的位置
int _front;
//队尾元素的下一位置
int _rear;
//所存元素个数 最后一个元素的位置是k
int _k;//元素计数时,是从0开始的
//所存元素的首地址
int *_data;
//当前有效元素个数
int _size;
}MyCircularQueue;
#endif
(2)main.c
#include"newCQueue.h"
MyCircularQueue* myCircularQueueCreate(int k)
{
MyCircularQueue * cq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
cq->_data = (int *)malloc(sizeof(int) * k);// 数据空间为 k,因为有size确定个数
cq->_k = k;
cq->_front = cq->_rear = 0;//0~k皆可
cq->_size = 0;
return cq;
}
bool myCircularQueueIsFull(MyCircularQueue *obj)
{
//方法一
//rear +1 % 空间的长度 == front
//return (obj->_rear + 1) % (obj->_k + 1) == obj->_front;
//方法二
return obj->_size == obj->_k;
}
bool myCircularQueueEnQueue(MyCircularQueue *obj, int value)
{
//判断队列是否为满
if (myCircularQueueIsFull(obj))
return false;
//队尾入队
obj->_data[obj->_rear++] = value;
//判断队尾是否越界 [0,k],越界则重置
if (obj->_rear >= obj->_k)
obj->_rear = 0;
obj->_size++;
return true;
}
bool myCircularQueueDeQueue(MyCircularQueue *obj)
{
//队列为空,出队失败
if (myCircularQueueIsFull(obj))
return false;
//队头出队
obj->_front++;
//判断队头是否越界
if (obj->_front >= obj->_k)
obj->_front = 0;
obj->_size--;
return true;
}
int myCircularQueueFront(MyCircularQueue *obj)
{
//返回队头元素
if (myCircularQueueIsFull(obj))
return -1;
return obj->_data[obj->_front];
}
int myCircularQueueRear(MyCircularQueue *obj)
{
//返回队尾元素
if (myCircularQueueIsFull(obj))
return -1;
if (obj->_rear != 0)
return obj->_data[obj->_rear - 1];//元素个数是从0开始计数的
else
//rear 为0,队尾在数组的末尾
return obj->_data[obj->_k - 1];
}
bool myCircularQueueIsEmpty(MyCircularQueue *obj)
{
/*return obj->_front == obj->_rear;*/
return obj->_size == 0;
}
void myCircularQueueFree(MyCircularQueue *obj)
{
free(obj->_data);
free(obj);
printf("已销毁 \n");
}
void myCircularQueuePrint(MyCircularQueue *obj)
{
int begin = obj->_front;
int end = obj->_rear == 0 ? obj->_rear + obj->_k : obj->_rear;
printf( "队列内容:");
while (begin < end)
{
printf("%d ",obj->_data[begin]);
begin++;
}printf("\n");
}
void test()
{
MyCircularQueue *cq = myCircularQueueCreate(5);
myCircularQueueEnQueue(cq, 1);
myCircularQueueEnQueue(cq, 2);
myCircularQueueEnQueue(cq, 3);
myCircularQueueEnQueue(cq, 4);
myCircularQueuePrint(cq); // 1 2 3 4
printf("\n");
myCircularQueueDeQueue(cq);
myCircularQueuePrint(cq); // 2 3 4
myCircularQueueDeQueue(cq);
myCircularQueuePrint(cq); // 3 4
printf("\n");
printf("此时队头元素为:%d \n", myCircularQueueFront(cq));
printf("此时队尾元素为:%d \n", myCircularQueueRear(cq));
printf("\n");
myCircularQueueFree(cq);
}
int main()
{
test();
system("pause");
return 0;
}
(3)运行结果