数据结构 队列queue 学习笔记

队列

定义:一种可以先进先出的存储结构。

分类:

  • 链式队列,用链表实现
  • 静态队列,用数组实现(必须是循环队列)

应用:
与时间有关的操作都与队列有关都有队列的影子

为了与栈的算法区分开,
这里要使用 的指针换个名字,其实也差不多滴,
那么这里的就叫rear 就叫font

Q1:

静态队列为什么是循环队列

A1:

在这里插入图片描述
当一个元素出队时,
底部的元素所占的内存就无法再重复使用了。
这造成了空间浪费,
这对于计算机来说是不好的,
因此要保护空间!!

入队伪算法

将值存入r指针所代表的位置
r=(r+1)%数组长度

出队伪算法

从f指针拿走,
f=(f+1)%数组长度

记住都是不断·上移的即可。

判断循环队列是否为空

只需要判断front与rear指针所指向的值是否相同即可。

判断循环队列是否为满

判断(r+1)%数组长度==f

对以上伪代码进行编程,
具体实现代码如下:

//遍历,入队,判断等
//队列 
//用front 和rear来当成数组,一次一次地进行一个又一个的操作 
#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 emput_queue(QUEUE *);//判断是否空 

int main()
{
	QUEUE Q;
	int val;
	init (&Q);
	en_queue(&Q,1); 
	en_queue(&Q,2); 
	en_queue(&Q,3); 
	en_queue(&Q,4); 
	en_queue(&Q,5); 
	en_queue(&Q,6); 
	en_queue(&Q,7); 
	
	traverse_queue(&Q);
	
	if(out_queue(&Q,&val))
	{
		printf("succeed!\n");
	}
	else
	{
		printf("failed!\n");
	}
	traverse_queue(&Q);
	return 0;
 } 
 
void init (QUEUE *pQ)
{
	pQ->pBase=(int *)malloc(sizeof(int )*6);
	//pBase这个元素代表了数组第一个元素的地址
	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)
{
	//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");
		
}

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值