速学数据结构 | 我不允许还有人不会用栈实现队列!

news2024/11/27 18:34:02

在这里插入图片描述

🎬 鸽芷咕:个人主页

 🔥个人专栏:《Linux深造日志》《C++干货基地》

⛺️生活的理想,就是为了理想的生活!

📋 前言

  🌈hello! 各位铁铁们大家好啊,不知道大家对栈和队列的学习都学过了吧?那么用栈来实现队列你会做嘛?
  ⛳️栈和队列我们前面说了都是一种特殊的线性表,而在学习过程中用栈来尝试实现队列是很有必要来考验一下我们对栈和队列的掌握的!
  📚本期文章收录在《数据结构&算法》,大家有兴趣可以看看呐
  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

文章目录

  • 📋 前言
  • 一、 栈实现队列具体要求
  • 二、栈实现队列的核心思想
    • 2.1 如何插入的思想
    • 2.2 如何插入呢?
  • 三、栈实现队列的代码实现
      • 3.1 栈实现队列的初始化
      • 3.2 栈实现队列判空
      • 3.3 栈实现队列的插入
      • 3.4 栈实现队列删除
      • 3.5 栈实现队列的头元素
      • 3.6 栈实现队列的销毁
  • 四、栈实现队列的成果检验
  • 📝全篇总结

一、 栈实现队列具体要求

在这里插入图片描述

二、栈实现队列的核心思想

  • 栈和队列一个后进先出一个先进先出先先在下图看一下我们的区别:

在这里插入图片描述

2.1 如何插入的思想

栈的特点是后进先出而我们要实现的队列是先进先出,诶这刚好和队列的特点相反:

  • 那么我们使用俩个栈
  • 一个用来插入数据
  • 一个用来把插入的数据翻转一下就不可以实现 先进先出的特点 了?

在这里插入图片描述

2.2 如何插入呢?

前面说了使用俩个栈来解决队列先进先出的问题,其核心思想就是

  • 一个栈来当 push 栈存放数据
  • 一个栈用来pop数据

那么具体的核心思想是什么?其实只需要把push的 翻转一下然后插入到pop 栈中就好了,这样我们就可以的到一个理论上先进先出的队列了。

  • 每次 pop 的时候都拿翻转完了之后的栈
  • 如何 pop 没有数据了就继续从 push 里面翻转导入数据。

在这里插入图片描述

三、栈实现队列的代码实现

核心思路我们有了接下来就是如何实现了,插入和删除解决了。其他问题那就不是问题非常简单就解决了,下面我们来看看把!

3.1 栈实现队列的初始化

初始化和以前一样既然需要俩个栈来模拟实现队列,那么就需要俩个指针来管理栈区就够了:

  • 空间还是和以前 malloc 就好了。
  • 先创建队列的空间在 , malloc 的空间。

📚 代码演示:

typedef struct {
    ST pushst;
    ST popst;
} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue* new = (MyQueue*)malloc(sizeof(MyQueue));
    STInit(&new->pushst);
    STInit(&new->popst);

    return new;
}

3.2 栈实现队列判空

判空这就巨简单了,既然我们用了俩个栈来实现队列那么只要这俩个栈都为空不就行了。

  • 核心思想 STEmpty(&obj->pushst) && STEmpty(&obj->popst)
  • 判断栈区是否为空使用栈的判断就好了

📚 代码演示:

bool myQueueEmpty(MyQueue* obj) {

    return STEmpty(&obj->pushst) && STEmpty(&obj->popst);
}

3.3 栈实现队列的插入

插入这个就是最简单的了,直接往push栈里面插入就好了:

📚 代码演示:

void myQueuePush(MyQueue* obj, int x) {

    STPush(&obj->pushst,x);
}

3.4 栈实现队列删除

删除队列就是我们前面的思想:

  • 每次取pop 栈里面的元素
  • 如果 pop 为空的话那么就从 push栈里面 翻转导入就好了。

📚 代码演示:

int myQueuePop(MyQueue* obj) {
    if(STEmpty(&obj->popst))
    {
        while(STSize(&obj->pushst))
        {
            STPush(&obj->popst,STTop(&obj->pushst));
            STPop(&obj->pushst);
        }
    }

    int top = STTop(&obj->popst);   
    STPop(&obj->popst);

    return top;
}

3.5 栈实现队列的头元素

头元素的的访问就很简单了,我们 pop 栈的第一个栈顶元素就是头元素:

  • 去直接访问就好了。
  • 但是要注意 pop 为空的时候就需要导入一下了。

📚 代码演示:

int myQueuePeek(MyQueue* obj) {
    if(STEmpty(&obj->popst))
    {
        while(STSize(&obj->pushst))
        {
            STPush(&obj->popst,STTop(&obj->pushst));
            STPop(&obj->pushst);
        }
    }

    return STTop(&obj->popst);
}

3.6 栈实现队列的销毁

销毁还是和以前一样,把malloc的空间都销毁:

  • 然后再销毁队列本身的空间

📚 代码演示:

void myQueueFree(MyQueue* obj) {
    STDestroy(&obj->pushst);
    STDestroy(&obj->popst);

    free(obj);
}

四、栈实现队列的成果检验

好了以上就是栈实现队列的全过程了:

  • 对应练习题在这里: 用栈实现队列

📚 代码演示:

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


//#define N 10
//struct Stack
//{
//	int a[N];
//	int top;
//};

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

void STInit(ST* ps);
void STDestroy(ST* ps);
void STPush(ST* ps, STDataType x);
void STPop(ST* ps);
STDataType STTop(ST* ps);

int STSize(ST* ps);
bool STEmpty(ST* ps);


void STInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}

void STDestroy(ST* ps)
{
	assert(ps);

	free(ps->a);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}

void STPush(ST* ps, STDataType x)
{
	assert(ps);
	// 11:40
	if (ps->top == ps->capacity)
	{
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}

		ps->a = tmp;
		ps->capacity = newCapacity;
	}

	ps->a[ps->top] = x;
	ps->top++;
}

void STPop(ST* ps)
{
	assert(ps);

	// 
	assert(ps->top > 0);

	--ps->top;
}

STDataType STTop(ST* ps)
{
	assert(ps);

	// 
	assert(ps->top > 0);

	return ps->a[ps->top - 1];
}

int STSize(ST* ps)
{
	assert(ps);

	return ps->top;
}

bool STEmpty(ST* ps)
{
	assert(ps);

	return ps->top == 0;
}


typedef struct {
    ST pushst;
    ST popst;
} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue* new = (MyQueue*)malloc(sizeof(MyQueue));
    STInit(&new->pushst);
    STInit(&new->popst);

    return new;
}

void myQueuePush(MyQueue* obj, int x) {

    STPush(&obj->pushst,x);
}

int myQueuePop(MyQueue* obj) {
    if(STEmpty(&obj->popst))
    {
        while(STSize(&obj->pushst))
        {
            STPush(&obj->popst,STTop(&obj->pushst));
            STPop(&obj->pushst);
        }
    }

    int top = STTop(&obj->popst);   
    STPop(&obj->popst);

    return top;
}

int myQueuePeek(MyQueue* obj) {
    if(STEmpty(&obj->popst))
    {
        while(STSize(&obj->pushst))
        {
            STPush(&obj->popst,STTop(&obj->pushst));
            STPop(&obj->pushst);
        }
    }

    return STTop(&obj->popst);
}

bool myQueueEmpty(MyQueue* obj) {

    return STEmpty(&obj->pushst) && STEmpty(&obj->popst);
}

void myQueueFree(MyQueue* obj) {
    STDestroy(&obj->pushst);
    STDestroy(&obj->popst);

    free(obj);
}

/**
 * Your MyQueue struct will be instantiated and called as such:
 * MyQueue* obj = myQueueCreate();
 * myQueuePush(obj, x);
 
 * int param_2 = myQueuePop(obj);
 
 * int param_3 = myQueuePeek(obj);
 
 * bool param_4 = myQueueEmpty(obj);
 
 * myQueueFree(obj);
*/

📝全篇总结

☁️ 好了以上就是栈的实现队列的全部解析了,总的来说只要掌握技巧就不难呢!核心思想掌握了那就直接秒杀.
看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
在这里插入图片描述

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

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

相关文章

LLM之幻觉(一):大语言模型幻觉解决方案综述

论文题目&#xff1a;《Cognitive Mirage: A Review of Hallucinations in Large Language Models》 ​论文链接&#xff1a;https://arxiv.org/abs/2309.06794v1 论文代码&#xff1a;https://github.com/hongbinye/cognitive-mirage-hallucinations-in-llms 一、幻觉介绍 …

【Python报错合集】Python元组tuple、张量tensor(IndexError、TypeError、RuntimeError……)~持续更新

文章目录 IndexError1. tuple index out of rangea. 示例代码b.报错原因c.解决方案 TypeError1. len() of a 0-d tensora. 示例代码b.报错原因c.解决方案 RuntimeError1. output with shape … doesnt match the broadcast shape …a. 示例代码b.报错原因c.解决方案 2. Cant ca…

【C++干货铺】内存管理new和delete

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 C语言中动态内存管理方式 malloc/calloc/realloc的区别&#xff1f; C内存管理的方式 内置类型 自定义类型 operator new 和 operator delete 函数 operato…

Premiere Pro 2024 v24.0

adobe Premiere Pro 2024 Mac版发布了吗&#xff1f;无论您是编辑社交媒体视频还是大电影&#xff0c;Premiere Pro 都可以帮助您借助工具精心创作有意义的故事。导入和编辑&#xff0c;添加效果&#xff0c;然后将素材导出到任何目标。无论您要创作什么内容&#xff0c;它都可…

正点原子嵌入式linux驱动开发——Linux 4G通信

前面学习了如何在Linux中使用有线网络或者WIFI&#xff0c;但是使用有线网络或者WIFI有很多限制&#xff0c;因为要布线&#xff0c;即使是WIFI也得先布线&#xff0c;然后再接个无线路由器。有很多场合是不方便布线的&#xff0c;这个时候就是4G大显身手的时候&#xff0c;产品…

mediapipe流水线分析 二

目标检测 Graph 一 流水线上游输入处理 1 TfLiteConverterCalculator 将输入的数据转换成tensorflow api 支持的Tensor TfLiteTensor 并初始化相关输入输出节点 &#xff0c;该类的业务主要通过 interpreter std::unique_ptrtflite::Interpreter interpreter_ nullptr; 实现…

Ansible入门使用

目录 前言 一、环境概况 修改主机名&#xff08;可选项&#xff09; 二、安装部署 1.安装epel扩展源 2.安装Ansible 3.修改Ansible的hosts文件 4.生成密钥 三、Ansible模块使用介绍 Command模块 Shell模块 User模块 Copy模块 File模块 Hostname模块 Yum模块 Se…

windows下mysql5.7.19批处理安装启动修改密码

有时候要在windows下安装mysql&#xff0c;新手一般觉得复杂&#xff0c;要搞命令行。 于是弄了些批处理&#xff0c;win7 64 测试通过&#xff0c; windows server 2012测试通过 mysql5.7.19 x64版本在windows下的一键安装批处理与mysql解压包 1&#xff0c;无需管理员运…

中国人民大学与加拿大女王大学金融硕士——一把开启未来金融世界的金钥匙

在这个日新月异、竞争激烈的时代&#xff0c;每个人都渴望不断提升自我&#xff0c;以应对不断变化的世界。在当今的金融领域&#xff0c;国际化的视野和多元化的知识结构变得越来越重要。如何才能掌握未来世界的金钥匙呢&#xff1f;其实&#xff0c;这把金钥匙并非遥不可及&a…

北斗升级轨道检查,高精度定位确保铁路畅通无阻

北斗升级轨道检查&#xff0c;高精度定位确保铁路畅通无阻 随着科技的发展&#xff0c;北斗卫星系统在各个领域的应用越来越广泛。其中&#xff0c;在铁路轨道检查中&#xff0c;北斗卫星技术的应用不仅能够提高效率&#xff0c;减少人力成本&#xff0c;还能够保障安全&#x…

变压器试验VR虚拟仿真操作培训提升受训者技能水平

VR电气设备安装模拟仿真实训系统是一种利用虚拟现实技术来模拟电气设备安装过程的培训系统。它能够为学员提供一个真实、安全、高效的学习环境&#xff0c;帮助他们更好地掌握电气设备的安装技能。 华锐视点采用VR虚拟现实技术、MR混合现实技术、虚拟仿真技术、三维建模技术、人…

css布局grid-template-columns属性

grid-template-columns属性可以用于创建一个网格布局&#xff0c;以下是使用此属性的步骤&#xff1a; 首先在网格容器上使用 display: grid; 将其转换为网格容器。 然后使用 grid-template-columns 属性来定义列的数量和大小。例如&#xff0c;使用 “grid-template-columns:…

私域流量搭建与运营,技巧全攻略!

2023年是比拼运营深度和服务效率的一年&#xff0c;用户对于体验的期望值将持续增长&#xff0c;企业需提供无缝的客户体验&#xff0c;以推动增长、保障收入、确保客户忠诚度。在疫情新常态下&#xff0c;企业已构建起APP、小程序等一系列线上触点矩阵&#xff0c;而各个触点之…

承载AI计算的数据中心网络和传统数据中心有何不同?

生成式AI正在风靡全球&#xff0c;不少企业开始研究如何在其业务流程中采用人工智能技术&#xff0c;更有一些企业客户开始考虑在数据中心和私有云中部署自己的AIGC和 GPU 扩展网络。从网络角度来看&#xff0c;用于承载这类业务的数据中心与传统的数据中心有很大不同&#xff…

Qt6远程连接MySQL数据库(简单易上手版)

在对照文章开始操作之前&#xff0c;MySQL 和 Navicat 的安装配置要自己提前弄好。 步骤1&#xff1a; 在电脑桌面任务栏中的搜索框中输入 mysql&#xff0c;找到名为&#xff1a;MySQL 8.0 Command Line Client&#xff0c;然后打开。 步骤2&#xff1a; 输入密码后回车&a…

从Hugging Face下载数据测试whisper、fast_whisper耗时

时长比较短的音频&#xff1a;https://huggingface.co/datasets/PolyAI/minds14/viewer/en-US 时长比较长的音频&#xff1a;https://huggingface.co/datasets/librispeech_asr?row8 下载数据集 from datasets import load_datasetminds_14 load_dataset("PolyAI/mind…

找短视频素材就上这8个网站

找短视频素材就上这8个网站&#xff0c;视频剪辑、自媒体必备&#xff0c;质量高&#xff0c;还能免费下载&#xff0c;赶紧收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计类素材为主&…

行业追踪,重构代码,把数据库数据搞坏了

自动复盘 2023-11-06 最近行情好&#xff0c;又有动力搞了&#xff0c;重构了数据库方面的代码&#xff0c;力求更快更稳定的更新数据&#xff0c;结果把数据库数据搞坏了&#xff0c;图有点问题。 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是…

Win10 + VS017 编译SQLite3.12.2源码

参考&#xff1a; [1] WIN10 VS2019下编译GDAL3.0PROJ6SQLite_gdal 3 win10编译-CSDN博客 [2] 如何编译SQLite-How To Compile SQLite-CSDN博客 如何生成静态库&#xff1a; 参考&#xff1a; WIN10 VS2019下编译GDAL3.0PROJ6SQLite_gdal 3 win10编译-CSDN博客 如何生成exe:…

如何在Linux环境搭建SVN服务器并实现公网访问

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…