网站建设接活app怎样在网上推广
使用顺序表来设计队列的最大优势是顺序表有可以定位元素的下标。
并且可以以Mod来使数组下标循环
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int CQDataType;
typedef struct {
int* array;
int front;
int tail;
int cap;
} MyCircularQueue;
//创建队列
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
obj->front = obj->tail = 0;
obj->cap = k;
CQDataType* tmp = (CQDataType*)malloc(sizeof(CQDataType) * (obj->cap + 1));
obj->array = tmp;
return obj;
}
//isEmpty() : 检查循环队列是否为空。
//isEmpty() : 检查循环队列是否为空。
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
assert(obj);
if (obj->front == obj->tail)
return true;
else
return false;
}
//isFull() : 检查循环队列是否已满
//isFull() : 检查循环队列是否已满
bool myCircularQueueIsFull(MyCircularQueue* obj) {
assert(obj);
if ((obj->tail+1) % (obj->cap + 1) == obj->front ))
return true;
else
return false;
}
//向循环队列插入一个元素。如果成功插入则返回真
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
assert(obj);
if (myCircularQueueIsFull(obj))
{
return false;
}
obj->array[obj->tail++] = value;
obj->tail %= (obj->cap + 1);
return true;
}
//从循环队列中删除一个元素。如果成功删除则返回真。
bool myCircularQueueDeQueue(MyCircularQueue* obj)
{
assert(obj);
if (myCircularQueueIsEmpty(obj))
{
return false;
}
else
{
if (obj->front == obj->cap)
obj->front = 0;
else
obj->front++;
}
return true;
}
//Front: 从队首获取元素。如果队列为空,返回 -1
int myCircularQueueFront(MyCircularQueue* obj) {
assert(obj);
if (myCircularQueueIsEmpty(obj))
return -1;
else
return obj->array[obj->front];
}
//获取队尾元素。如果队列为空,返回 -1 。
int myCircularQueueRear(MyCircularQueue* obj) {
assert(obj);
if (obj->front == obj->tail)
{
return -1;
}
else
{
if (obj->tail == 0)
{
return obj->array[obj->cap];
}
else
{
return obj->array[obj->tail - 1];
}
}
}
//内存释放
void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->array);
obj->front = NULL;
obj->tail = NULL;
obj->cap = 0;
}