- 循环队列
- 判断是否满不满
- 满与空的演化
- 空循环队列的判定
- 空循环队列的创建
- 循环队列的队尾插入
- 循环队列的队头删除
- 循环队列的头部元素
- 循环队列的尾部元素
- 循环队列的销毁
- 循环队列的测试
- 奶奶常说,把每一天都当作最后一天来过..
一段链表或者数组可以重复利用,通常是定长的,因此要多开辟一个空间作为缓冲区。当满了还要继续插入,Front往后一个,再从尾部入队,直接覆盖,数组实现更方便
如果没有缓冲区,则空队列的时候,Front和Rear相等,满的时候它俩也相等
bool myCircularQueueIsFull(MyCircularQueue* obj)
{
assert(obj);
return (obj->rear + 1) % (obj->size) == (obj->front);
}
满与空的演化
bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{
assert(obj);
return obj->front == obj->rear;
}
空循环队列的创建
#include循环队列的队尾插入#include #include #include //用数组实现 下标 0 1 2 3 typedef struct { int* a; int front;..下标指向头 int rear; ..下标指向尾 int size; ..记录空间大小:外部要求开辟n个 size = n+1 } MyCircularQueue; MyCircularQueue* myCircularQueueCreate(int k) { MyCircularQueue* pc = (MyCircularQueue*)malloc(sizeof(MyCircularQueue)); pc->a = (int*)malloc(sizeof(int) * (k + 1)); pc->front = pc->rear = 0; pc->size = k + 1; return pc; }
void MyCircularQueueEnQueue(MyCircularQueue* obj, int value)
{
assert(obj);
if (!myCircularQueueIsFull(obj))
{
obj->a[obj->rear] = value;
obj->rear++;
obj->rear %= (obj->size);
}
else
{
printf("队列已经满了n");
}
}
循环队列的队头删除
void myCircularQueueDeQueue(MyCircularQueue* obj)
{
assert(obj);
if (myCircularQueueIsEmpty(obj))
{
printf("队列为空,无法删除n");
}
else
{
obj->front++;
obj->front %= (obj->size);
}
}
循环队列的头部元素
int myCircularQueueFront(MyCircularQueue* obj)
{
assert(obj);
if (myCircularQueueIsEmpty(obj))
{
return -1;
}
return obj->a[obj->front];
}
循环队列的尾部元素
int myCircularQueueRear(MyCircularQueue* obj)
{
assert(obj);
if (myCircularQueueIsEmpty(obj))
{
return -1;
}
rear 插入一个后要++,因此-1,参考上图,如果为0,则,,,,
int prevrear = obj->rear - 1;
if (prevrear == 0)
{
prevrear = obj->size - 1;
}
return obj->a[prevrear];
}
循环队列的销毁
void myCircularQueueFree(MyCircularQueue* obj)
{
assert(obj);
free(obj->a);
free(obj);
}
循环队列的测试
int main()
{
MyCircularQueue* pm = myCircularQueueCreate(3);
MyCircularQueueEnQueue(pm, 20);
MyCircularQueueEnQueue(pm, 30);
printf("循环队列是否为空:%dn", myCircularQueueIsEmpty(pm));
printf("循环队列队头元素:%dn", myCircularQueueFront(pm));
printf("循环队列队尾元素:%dn", myCircularQueueRear(pm));
printf("循环队列满了吗:%dn", myCircularQueueIsFull(pm));
myCircularQueueFree(pm);
return 0;
}
奶奶常说,把每一天都当作最后一天来过…


