文章目录
//队列:先进后出的一种线性结构,入队(插入)的一端称为队尾,出队(删除)的一端称为队头
//队列的存储方式有两种,一种为顺序结构(顺序队列),另一种为链式结构(链式队列)
//顺序队列一定会设计成环形队列,原因是线性队列的入队为O(1),出队为O(n)
//环形队列的入队为O(1),出队为O(1)
//满:尾指针再走一步就到头指针;浪费一个空间不实用,主要是为了区分空和满的情况
//顺序队列主要理解两点设计:1.为什么是环形?2.为什么要浪费一个空间
queue头文件
#pragma once
#define INIT_SIZE 10
typedef struct
{
int* base;//指向动态内存
int front;//队头指针,队头元素的下标
int rear;//队尾指针,当前可以插入数据的下标(队尾后一个元素的下标)
}SqQueue, * PSqQueue;
//初始化
void InitQueue(PSqQueue ps);
//往队列中入数据(入队操作)
bool Push(PSqQueue ps, int val);
//获取队头元素的值,但不删除
bool GetTop(PSqQueue ps, int* rtval);
//获取队头元素的值,且删除
bool Pop(PSqQueue ps, int* rtval);
//判断队是否为空
bool IsEmpty(PSqQueue ps);
//获取队有效数据的个数
int GetLength(PSqQueue ps);
//清空所有的数据
void Clear(PSqQueue ps);
//销毁
void Destroy(PSqQueue ps);
queue.cpp文件
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "queue.h"
//初始化
void InitQueue(PSqQueue ps)
{
assert(ps != NULL);
if (ps == NULL)
return;
ps->base = (int*)malloc(INIT_SIZE * sizeof(int));
assert(ps->base != NULL);
ps->front = 0;
ps->rear = 0;
}
static bool IsFull(PSqQueue ps)
{
if ((ps->rear + 1) % INIT_SIZE == ps->front)
return true;
return false;
}
//往队列中入数据(入队操作)
bool Push(PSqQueue ps, int val)
{
if (IsFull(ps)) return false;
ps->base[ps->rear] = val;
ps->rear = ( ps->rear + 1 ) % INIT_SIZE;
return true;
}
//获取队头元素的值,但不删除
bool GetTop(PSqQueue ps, int* rtval)
{
assert(ps != NULL && rtval != NULL);
if (IsEmpty(ps))
return false;
*rtval = ps->base[ps->front];
return true;
}
//获取队头元素的值,且删除
bool Pop(PSqQueue ps, int* rtval)
{
assert(ps != NULL && rtval != NULL);
GetTop(ps, rtval);
ps->front = (ps->front + 1) % INIT_SIZE;
return true;
}
//判断队是否为空
bool IsEmpty(PSqQueue ps)
{
return ps->front == ps->rear;
}
//获取队有效数据的个数
int GetLength(PSqQueue ps)
{
return (ps->rear + INIT_SIZE - ps->front) % INIT_SIZE;
}
//清空所有的数据
void Clear(PSqQueue ps)
{
ps->rear = ps->front;
}
//销毁
void Destroy(PSqQueue ps)
{
free(ps->base);
ps->base = NULL;
ps->front = ps->rear = 0;
}