数据结构----栈和队列之队列的实现

news2024/12/22 17:28:35

目录

1.基本概况

2.队列组成

3.队列的实现

(1)队列的初始化

(2)队列的销毁

(3)队列的尾插

(4)队列的头删

(5)队列的判空

(6)队列的元素个数

(7)返回头部节点

(8)返回尾部节点

4.完整代码

(1)头文件

(2)源文件

(3)测试文件


1.基本概况

(1)我们之前学习了栈,栈就是先进入,后出来,后进先出,然后使用这个特性解决了括号的匹配问题;

(2)队列就是先进先出,而且是从一头进入,从另外一头出去,栈分为入栈和出栈,队列里面也是分为入队和出队两个部分;

2.队列组成

(1)队列里面的每一个数据也是有自己的next指针和val数值的,但是我们在实现这个在队尾队头插入数据的时候,这个传入这个队头的指针和队尾的指针,而且是二级指针,为什么要传递二级指针,因为我们本身传递的参数就是一个指针,通过这个指针,函数实现的时候才可以找到这个队列的头部尾部节点,我们经过这个插入和删除之后,这个形参的修改时需要同步到实参,但是如果我们传递这个一级指针,就没有办法实现这一点,因此,我们需要传递二级指针;

(2)为什么进行队尾和队头的插入和删除的时候,参数里面是两个指针,一个是头指针,一个是尾指针,插入数据的时候还需要给一个变量作为第三个参数;

(3)这个地方,为了简单起见,我们决定再去定义一个结构体,存放这个头结点和尾结点,这个时候,我们就定义了两个结构体,第一个结构体表示的是每一个节点,这个节点里面包括了这个next指针和val数值,第二个结构体里面包含这个队列的头指针和尾指针;

(4)定义了两个结构体之后,我们就可以把这个结构体作为参数进行传递,因为我们的这个结构体里面是两个一级指针,我们传递参数的时候只需要把这个结构体的指针传递进行就可以了,这个结构体里面就包含了队列的头指针和尾指针;

3.队列的实现

(1)队列的初始化

就是先去断言,然后把这个队列的头尾指针全部置为空指针,节点的个数初始化为0;

(2)队列的销毁

使用循环语句,不断的释放每一个节点,最后再让这个phead和ptail全部置空;

(3)队列的尾插

我们知道这个队列里面的数据都是从队尾进入,所以这个push也是从队尾去插入数据,我们需要手动的开辟新的节点空间;

如果这个队列本来就是空的,这个时候队列的头节点和尾结点都是newnode,否则的话,这个头结点不变,尾结点更新一下就可以了,使用if  else实现这个功能;

(4)队列的头删

我们的队列里面的数据从头部出来,简称头部删除,我们需要判断这个队列里面的元素的个数,如果这个队列里面只有一个节点,这个时候ptail和phead都是指向的这个节点,我们把任意的一个空间释放掉,另外一个就会变成野指针;

因此我们进行判断,如果只有一个节点,释放完空间之后,把这个ptail和phead都置为空指针;否则就把这个next节点记录下来,删除旧的节点之后,让我们的next成为新的头结点;

(5)队列的判空

直接判断这个pq->size==0即可,如果是0,就说明这个队列里面没有数据,返回值bool就是0,有数据的话就返回的是1;

(6)队列的元素个数

pq->size就是这个队列里面的节点的个数,直接返回即可;

(7)返回头部节点

返回头部节点,pq这个队列不可以是空的,而且这个队列的头结点不可以是空的,否则我们的这个目的就无法达到;

(8)返回尾部节点

返回尾部节点,这个队列不可以是空的,而且这个队列的尾部节点不可以是空的,否则无法找到这个节点里面的val数值;

4.完整代码

(1)头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef int qdatatype;

typedef struct quenenode
{
	struct quenenode* next;
	qdatatype val;
}qnode;

//队列的一个特点就是先进先出,后进后出

typedef struct quene
{
	qnode* phead;
	qnode* ptail;
	int size;
}quene;

void queneinit(quene* pq);

void quenedestory(quene* pq);

void quenepush(quene* pq, qdatatype x);

qdatatype queneback(quene* pq);

qdatatype quenefront(quene* pq);

int quenesize(quene* pq);

bool queneempty(quene* pq);

(2)源文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"quene.h"

void queneinit(quene* pq)
{
	assert(pq);
	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}

void quenedestory(quene* pq)
{
	assert(pq);
	qnode* cur = pq->phead;
	while (cur)
	{
		qnode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->phead = pq->ptail = NULL;
}

void quenepush(quene* pq, qdatatype x)
{
	assert(pq);
	qnode* newnode = (qnode*)malloc(sizeof(qnode));
	if (newnode == NULL)
	{
		perror("malloc fail!");
		return;
	}
	newnode->next = NULL;
	newnode->val = x;
	if (pq->ptail == NULL)
	{
		pq->ptail = pq->phead = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	pq->size++;
}
//出队列,从头部删除数据
void quenepop(quene* pq)
{
	assert(pq);
	if (pq->phead->next == NULL)
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	else
	{
		qnode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
	pq->size--;
}

qdatatype queneback(quene* pq)
{
	assert(pq);
	assert(pq->ptail);
	return pq->ptail->val;
}

qdatatype quenefront(quene* pq)
{
	assert(pq);
	assert(pq->phead);
	return pq->phead->val;
}

int quenesize(quene* pq)
{
	assert(pq);
	return pq->size;
}

bool queneempty(quene* pq)
{
	assert(pq);
	return pq->size == 0;
}

(3)测试文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"quene.h"
void test01()
{
	quene q;
	queneinit(&q);
	quenepush(&q, 1);
	quenepush(&q, 2);
	quenepush(&q, 3);
	quenepush(&q, 4);
	while (!queneempty(&q))
	{
		printf("%d ", quenefront(&q));
		quenepop(&q);
	}
	printf("\n");
}
int main()
{
	test01();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1891520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

量产工具一一文字系统(三)

目录 前言 一、文字数据结构抽象 1.描述一个文字的位图 2.描述一个字库操作 3.font_manager.h 二、实现Freetype封装 1.freetype.c 三、实现文字管理 1.font_manager.c 四、单元测试 1.font_test.c 2.disp_manager.c 3.disp_manager.h 4.上机测试 前言 前面我们…

vue-router拆分音乐播放界面实战

创建项目 npm install -g pnpm pnpm create vite安装 pnpm add vue-routersrc/main.js import {createApp} from vue import ./style.css import App from ./App.vue import router from "./router/index.js";const app createApp(App) app.use(router) app.moun…

2024上半年网络工程师考试《应用技术》试题一

阅读以下说明&#xff0c;回答问题。 【说明】 MPLS基于(1)进行转发&#xff0c;进行MPLS标签交换和报文转发的网络设备称为(2)&#xff0c;构成MPLS域(MPSDomain)。位于MPLS域边缘、连接其他网络的LSR称为(3),区域内部的LSR称为核心LSR(CoreLSR)IP报文进入MPLS网络时&#xf…

微软关闭中国所有线下店,并不影响全球第一

​关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 微软没有被时代淘汰&#xff0c;时代也没有告别微软!中国市场对微软可有可无&#xff0c;即便没有中国市场&#xff0c;微软市值也在全球前三&#xff0c;这是事实!a 5月中旬&#xff0c;微软azure解散中国分部…

泛微开发修炼之旅--30 linux-Ecology服务器运维脚本

文章链接&#xff1a;30 linux-ecology服务器运维脚本

Java线程同步的特征和安全类型

一线程同步的特征 ◆不同的线程在执行以同一个对象作为锁标记的同步代码块或同步方法时&#xff0c;因为要获得这个对象的锁而相互牵制&#xff0c;多个并发线程访问同一资源的同步代码块或同步方法时。 ◆同一时刻只能有一个线程进入synchronized(this)同步代码块。 ◆当一个…

SpringBoot 通过Knife4j集成API文档 在线调试

介绍 Knife4j 是一款基于 Swagger 构建的增强型 API 文档生成工具&#xff0c;它提供了更多的定制化功能和界面优化&#xff0c;使得生成的 API 文档更加美观和易用。它可以帮助开发者快速生成和管理 API 文档&#xff0c;支持在线调试和交互。 依赖 <!--knife4j--> &…

Python容器 之 练习题

1.字符串的基本使用 # 定义一个字符串 str1, 字符串的内容为 "hello world and itcast and itheima and Python" str1 "hello world and itcast and itheima and Python" # 在字符串str1中查找 字符串 and 的下标 num str1.find(and) print(num) # 12…

【设计模式】行为型-状态模式

在变幻的时光中&#xff0c;状态如诗篇般细腻流转。 文章目录 一、可调节的灯光二、状态模式三、状态模式的核心组件四、运用状态模式五、状态模式的应用场景六、小结推荐阅读 一、可调节的灯光 场景假设&#xff1a;我们有一个电灯&#xff0c;它可以被打开和关闭。用户可以…

Promethuse-监控 Etcd

一、思路 Prometheus监控Etcd集群&#xff0c;是没有对应的exporter&#xff0c;而 由CoreOS公司开发的Operator&#xff0c;用来扩展 Kubernetes API&#xff0c;特定的应用程序控制器&#xff0c;它用来创建、配置和管理复杂的有状态应用&#xff0c;如数据库、缓存和监控系…

学习和发展人工智能:新兴趋势和成功秘诀

人工智能(AI)继续吸引组织&#xff0c;因为它似乎无穷无尽地提高生产力和业务成果。在本博客中&#xff0c;了解学习和发展(L&D)部门如何利用人工智能改进流程&#xff0c;简化工作流程&#xff1f; 学习与发展(L&D)部门领导开始探索如何提高和支持人工智能能力的劳动…

超快的 Python 包管理工具「GitHub 热点速览」

天下武功&#xff0c;无坚不破&#xff0c;唯快不破&#xff01; 要想赢得程序员的欢心&#xff0c;工具的速度至关重要。仅需这一优势&#xff0c;即可使其在众多竞争对手中脱颖而出&#xff0c;迅速赢得开发者的偏爱。以这款号称下一代极速 Python 包管理工具——uv 为例&…

PyMuPDF 操作手册 - 08 API - Document属性方法和简短说明

文章目录 https://pymupdf.readthedocs.io/en/latest/document.html#Document 方法/属性简短描述Document.add_layer()仅限 PDF:进行新的可选内容配置Document.add_ocg()仅限 PDF:添加新的可选内容组Document.authenticate()访问加密文档Document.bake()仅限 PDF:将…

Bootstrap 图片

Bootstrap 图片 Bootstrap 是一个流行的前端框架,它提供了一套丰富的工具和组件,用于快速开发响应式和移动优先的网页。在本文中,我们将探讨如何使用 Bootstrap 来处理和展示图片,包括图片的响应式设计、图片样式和图片布局。 响应式图片 Bootstrap 通过其栅格系统提供了…

前端利用vue如何实现导入和导出功能.md

1. 前端利用vue如何实现导入和到处功能 1.1. 导入功能&#xff08;以导入Excel文件为例&#xff09; 1.1.1. 实现步骤: 1.1.1.1. 安装依赖: 首先&#xff0c;你需要安装处理Excel文件的库&#xff0c;如xlsx。1.1.1.2. 创建上传组件: 使用Element UI的<el-upload>组件或其…

基于Vue框架实现的记事本

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>懒人记事本</title><style>body {fo…

PyCharm 如何设置作者信息

1、点击pycharm右上角的齿轮&#xff0c;选择settings 2、选择editor 3、选择 Editor File and Code Templates 4、选择作者信息的文件类型&#xff0c;中间选择框选择Python Script 5、然后在右边的输入框中输入相关的信息 # -*- coding: utf-8 -*- """ Time …

JAVA+SSM+VUE《教学视频点播系统》

1管理员登录 管理员登录&#xff0c;通过填写用户名、密码、角色等信息&#xff0c;输入完成后选择登录即可进入视频点播系统&#xff0c;如图1所示。 图1管理员登录界面图 2管理员功能实现 2.1 修改密码 管理员对修改密码进行填写原密码、新密码、确认密码并进行删除、修改…

密码学复习

目录 基础 欧拉函数 欧拉函数φ(n)定义 计算方法的技巧 当a=a_1*a_2*……*a_n时 欧拉定理 剩余系 一些超简单密码 维吉尼亚 密钥fox 凯撒(直接偏移) 凯特巴氏(颠倒字母表) 摩斯密码(字母对应电荷线) 希尔(hill)密码 一些攻击 RSA 求uf+vg=1 快速幂模m^…

【shell script】

文章目录 一、基础shell script二、脚本运行方式的差异三、判断式1.利用test命令2.利用判断符号[] 四、if&#xff0c;case语句1.if...then2.case...esac 五、函数function六、循环1.while和until循环2.for循环 一、基础shell script 在“shell”部分&#xff0c;那是在命令行…