IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 3.4、队列 -> 正文阅读

[网络协议]3.4、队列

作者:recommend-item-box type_blog clearfix

如果你快乐起来了,就没法继续悲伤。

3.4、队列

? ????定义:

? ????????????一种可以实现“先进先出”的存储结构

? ????分类:

? ????????????链式队列 – 用链表实现

? ????????????静态队列 – 用数组实现

? ????????????????静态队列通常都必须是循环队列

? ????循环队列【思考】:

? ????????????1、 静态队列为什么必须是循环队列?

? ????????????2、 循环队列需要几个参数来确定?

? ????????????3、 循环队列各个参数的含义

typedef struct Queue
{
	int * pBase; // 使用数组实现则 pBase相当于数组名
	int front;  //队头
	int rear;	//队尾
}QUEUE;

? ????????????4、循环队列入队伪算法

? ????????????5、循环队列出队伪算法

? ????????????6、 如何判断循环队列是否为空

? ????????????????pQ->front == pQ->rear

? ????????????7、 如何判断循环队列是否已满
????????????????????????两种方式:
????????????????????????????????????1.多增加一个表标识参数
????????????????????????????????????2.少用一个元素【通常使用】
???????????????????????????????????????????????? 如果r和f的值紧挨着,则队列已满
???????????????????????????????????????????????? if( (r+1)%数组长度 == f )
???????????????????????????????????????????????? ??????已满
???????????????????????????????????????????????? else
?????????????????????????????????????????????????????? 不满

? ????队列算法:

? ????????????入队

? ????????????出队

? ????队列的具体应用:

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

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

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

void init(QUEUE *); // 初始化 
bool en_queue(QUEUE *, int val); // 入队
bool traverse_queue(QUEUE *); // 遍历 
bool full_queue(QUEUE *);	// 判断队列是否已满 
bool out_queue(QUEUE *, int *); //出队 
bool empty_queue(QUEUE *); // 判断队列是否为空 


int main(void) {
	QUEUE q;
	
	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); // 此处初始化队列长度为6,但循环队列 一般只存放 队列长度-1 个元素,所以6不会入队 
	
	traverse_queue(&q); //  1       2       3       4       5
	
	int val;
	if(out_queue(&q, &val))
	{
		printf("出队成功!出队元素为:%d\n",val);
	}
	else
	{
		printf("出队失败\n");
	}
	traverse_queue(&q); // 2       3       4       5
	return 0;
}


void init(QUEUE * pQ)
{
	pQ->pBase = (int *)malloc(sizeof(int) * 6); // 假定队列长度为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;
	}
}

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

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;
	} 	
} 


 

运行结果如下:
在这里插入图片描述

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-01-04 13:46:39  更:2022-01-04 13:47:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/5 9:28:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码