顺序队列特性:
允许插入的一端叫队尾,O(1)
允许删除的一端叫队头,O(n)
如果把顺序队列设计成循环队列,可以把删除操作变为O(1)
先进先出,后进后出
结构体
typedef struct SqQueue
{
int front;//队头
int rear;//队尾下标,同“栈”的"top"指针,指向当前可以存放的结点
int *base;
int queue_size;//如果要扩容,则需要加入这个成员
}SqQueue,*PSqQueue;
初始化
void InitQueue(PSqQueue pq)//初始化
{
assert(pq != NULL);
pq->front = 0;
pq->rear = 0;
pq->base = (int*)malloc(sizeof(int) * N);
assert(pq->base != NULL);
}
判满
static bool IsFull(PSqQueue pq)
{
return (pq->rear + 1) % N == pq->front;
}
入队
bool Push(PSqQueue pq, int val)//入队
{
//浪费一个格子来判断 队列是否满员
assert(pq != NULL);
//判满
if (IsFull(pq))
{
return false;
}
//填入数据
pq->base[pq->rear] = val;
//移动尾指针,注意是环
pq->rear=(pq->rear + 1)%N;
return true;
}
判空
bool IsEmpty(PSqQueue pq)//判空
{
assert(pq != NULL);
return pq->rear == pq->front;
}
获取队头元素的值,不删除
bool GetTopData(PSqQueue pq, int* rtval)//获取队头元素的值,不删除
{
assert(pq != NULL);
if (pq == NULL)
{
return false;
}
if (IsEmpty(pq))
{
return false;
}
*rtval = pq->base[pq->front];
return true;
}
获取队头元素的值,删除
bool Pop(PSqQueue pq, int* rtval)//获取队头元素的值,删除
{
assert(pq != NULL);
if (pq == NULL)
{
return false;
}
*rtval = pq->base[pq->front];
pq->front = (pq->front+1) % N;
return true;
}
获取长度
int GetLength(PSqQueue pq)//获取栈里个数
{
return (pq->rear - pq->front + N) % N;
}
销毁
void Destory(PSqQueue pq)
{
//我的想法:
/*assert(pq != NULL);
while (!IsEmpty(pq))
{
pq->front = (pq->front + 1) % N;
}*/
assert(pq != NULL);
if (pq == NULL)
{
return;
}
free(pq->base);
pq->front = 0;
pq->rear = 0;
}
输出
void Show(PSqQueue pq)
{
assert(pq != NULL);
for (int i = pq->front; i < GetLength(pq); i++)
{
printf("%d ", pq->base[i]);
}
}