《数据结构》——队列相关知识点笔记(循环队列的数组实现方式)

6 篇文章 0 订阅
1 篇文章 0 订阅

队列

  • 定义:一种可以实现“先进先出”的存储结构
  • 分类:
    静态队列:用数组实现
    链式队列:用链表实现

循环队列

  • 静态队列为什么必须是循环队列
    传统方式实现不了

  • 循环队列需要几个参数来确定
    需要两个参数来确定:front,rear

  • 循环队列各个参数的含义
    2个参数不同场合有不同的含义
    建议初学者先记住,然后慢慢体会
    1).队列初始化
    front和rear的值都是零
    2).队列非空
    front代表的是队列的第一个元素
    rear代表的是队列的最后一个有效元素的下一个元素
    3).队列空
    front和rear的值相等 ,但不一定是零

  • 循环队列入队伪算法讲解
    两步完成:
    1.将值存入rear所代表的位置
    2.rear=(rear+1)%数组的长度

  • 循环队列出队伪算法讲解
    front=(front+1)%数组的长度

  • 如何判断循环队列是否为空
    如果front与rear的值相等, 则该队列一定为空

  • 如何判断循环队列是否已满
    预备知识:
    front的值可能比rear大
    front的值也可能比rear小
    当然也可能两者相等
    两种方式
    1.多增加一个标识参数
    2.少用一个元素【通常用这种方式】
    如果rear和front挨着,则队列已满
    c语言伪算法表示就是:
    if((rear+1)%数组长度==front)
    已满
    else
    不满

队列算法

  • 入队
  • 出队

队列的具体应用

  • 所有和时间有关的操作都有队列的影子。

代码展示

#include <stdio.h>
#include <malloc.h>


typedef struct Queue
{
	int *pBase;
	int front;
	int rear;
}QUEUE;

void init(QUEUE *);
bool en_queue(QUEUE *,int val);
void traverse_queue(QUEUE *);
bool full_queue(QUEUE *);
bool out_queue(QUEUE *,int *);
bool empty_queue(QUEUE *);

int main(void)
{
	QUEUE Q;
	int val;

	init(&Q);
	en_queue(&Q,1);
	en_queue(&Q,2);
	en_queue(&Q,3);
	en_queue(&Q,5);
	en_queue(&Q,4);
	en_queue(&Q,5);
	en_queue(&Q,6);
	en_queue(&Q,7);
	en_queue(&Q,8);
	traverse_queue(&Q);

	if(out_queue(&Q,&val))
	{
		printf("出队成功,出队元素为:%d\n",val);
	}
	else
	{
		printf("出队失败!\n");
	}
	traverse_queue(&Q);

	
	return 0;
}

void init(QUEUE *pQ)
{
	pQ->pBase=(int *)malloc(sizeof(int) * 6);
	pQ->front=0;
	pQ->rear=0;
}

bool full_queue(QUEUE *pQ)
{
	if((pQ->rear+1)%6==pQ->front)
		return true;
	else
		return false;
}

bool en_queue(QUEUE *pQ,int val)
{
	if(full_queue(pQ))
	{
		return false;
	}
	else
	{
		pQ->pBase[pQ->rear]=val;//[下标位置]
		pQ->rear=(pQ->rear+1)%6;
		return true;
	}

}

void traverse_queue(QUEUE * pQ)
{
	int i=pQ->front;
	while(i !=pQ->rear)
	{
		printf("%d",pQ->pBase[i]);
		i=(i+1)%6;
	}
	printf("\n");
	return;
}

bool empty_queue(QUEUE *pQ)
{
	if(pQ->front==pQ->rear)
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool out_queue(QUEUE *pQ,int *pVal)
{
	if(empty_queue(pQ))
	{
		return false;
	}
	else
	{
		*pVal=pQ->pBase[pQ->front];
		pQ->front=(pQ->front+1)%6;
		return true;
	}

}

代码来源郝斌数据结构视频课程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值