基础数据结构---队列

//队列:先进后出的一种线性结构,入队(插入)的一端称为队尾,出队(删除)的一端称为队头
//队列的存储方式有两种,一种为顺序结构(顺序队列),另一种为链式结构(链式队列)

//顺序队列一定会设计成环形队列,原因是线性队列的入队为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;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__小柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值